SQL Server의 READ COMMITTED SNAPSHOT 및 SNAPSHOT


23

SQL Server READ COMMITTED SNAPSHOTSNAPSHOT격리 수준 의 차이점을 조사 하고 다음 리소스를 살펴 보았습니다.

행 버전 관리 기반 격리 수준 선택

대부분의 응용 프로그램에서 다음과 같은 이유로 행 버전 관리를 사용하여 읽기 커밋 격리를 권장합니다.

  • 스냅 샷 격리보다 tempdb 공간을 덜 사용합니다.

  • 스냅 샷 격리는 행 버전 관리를 사용하여 커밋 된 격리 읽기에 적용 할 수없는 업데이트 충돌에 취약합니다. 스냅 샷 격리에서 실행중인 트랜잭션이 다른 트랜잭션에 의해 수정 된 데이터를 읽을 때 스냅 샷 트랜잭션에 의해 동일한 데이터로 업데이트하면 업데이트 충돌이 발생하고 트랜잭션이 종료되고 롤백됩니다. 행 버전 관리를 사용하는 읽기 커밋 된 격리의 문제는 아닙니다.

나는이 주제에 다소 익숙하지 않지만 위의 링크에서 두 가지 글 머리 기호를 이해할 수없는 것 같습니다.

  1. 이러한 모드에서 tempdb 공간이 다른 이유는 무엇입니까? 하나는 다른 것보다 더 세분화 된 버전을 저장합니까?

  2. 스냅 샷 격리가 업데이트 충돌에 더 취약한 이유는 무엇입니까?

답변:


18
  1. READ COMMITTED SNAPSHOT각 명령문 다음에 새 스냅 샷을 사용합니다. 즉, 적은 행 버전이 유지되고 있음을 의미합니다. (문서에서 인용 한 설명은 이것이 항상 사실임을 암시하기 때문에 약간 오도 SNAPSHOT합니다. 장기 실행 트랜잭션의 경우에만 해당 됩니다.) 스냅 샷 행 버전은 쓰기시 작성됩니다. 읽기는 tempdb에 넣는 내용에 영향을 미치지 않습니다. 작가는 미래에 어떤 책을 읽을 것인지 예측할 수 없습니다. 독자는 제거 할 수있는 대상에만 영향을줍니다.
  2. SNAPSHOT트랜잭션이 T1다른 트랜잭션에 의해 수정 된 행에 기록 T2사이의 시간에 T1시작하고 T1쓰기를 시도, 문은 업데이트 충돌 오류와 함께 실패합니다. 이것은 낙관적 동시성 모델입니다. 함께 READ COMMITTED SNAPSHOT T1기다릴 것이다 T2행에서 X 잠금을 해제하고 정상적으로 계속합니다.

1
# 2의 경우 SNAPSHOT이 독점적으로 업데이트를 잠그지 않는다고 말하는 것이 안전합니까? 행 버전 관리에만 의존합니까?
John Russell

1
@JohnRussell 롤백을 지원하기 위해 독점적으로 잠급니다. 롤백시 행을 복원 할 수 있도록 모든 쓰기는 X- 잠금이어야합니다.
usr

0

스냅 샷과 읽기 커밋 된 스냅 샷의 또 다른 차이점은 다음과 같습니다.

  1. 스냅 사진

첫 번째 세션에서

TRAN ISOLATION LEVEL SNAPSHOT BEGIN TRAN SELECT 설정 * FROM TB1 ..... .....

두 번째 세션에서

TB1 SET NAME = NAME + 'test'업데이트 id = 1

첫 번째 세션에서

SELECT * FROM TB1-이 값은 name + 'test'가 아닌 ID = 1의 값 이름을 반환합니다. COMMIT TRAN

커밋 된 읽기 스냅 샷에서 세션 1의 첫 번째 선택은 id = 1에 대한 이름을 반환하고 두 번째 선택은 이름 + 'test'를 반환합니다.

따라서 스냅 샷 격리에서 SQL SERVER는 트랜잭션 시작시 스냅 샷을 작성하고 전체 트랜잭션 중에 해당 스냅 샷에서 읽습니다.

커밋 된 읽기 스냅 샷에서는 트랜잭션 중에 모든 SELECT 문에 대해 스냅 샷이 생성됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.