0

나는 마이크로 소프트의 사이트 데이터베이스가 복구되는 경우를 제외하고, 데이터를 읽을 때 SQL Server가 잠금을 요청하지 않는 http://msdn.microsoft.com/en-us/library/ms173763.aspx공유 READ_COMMITTED_SNAPSHOT 잠금 및 스냅 숏 격리

에 읽었습니다.

READ_COMMITTED_SNAPSHOT/SNAPSHOT ISOLATION을 사용하는 Sql Server가 공유 잠금을 전혀 사용하지 않는다는 의미입니까? 어떻게 가능합니까?

예를 들어, 2 개의 트랜잭션이있는 경우. 첫 번째 트랜잭션 T1이 일부 행을 업데이트하려고합니다. 두 번째 트랜잭션 T2가 동일한 행 읽기를 시작합니다 (이 트랜잭션은 그를 일부 출력 버퍼, 응답 버퍼 또는 SQL Server에서 호출 된 모든 트랜잭션으로 복사합니다). 동시에 트랜잭션 T1이 해당 행을 업데이트하기 시작합니다 (버전이 지정된 행이 먼저 생성됨).

트랜잭션 T2가 커밋되지 않은 데이터를 읽을 가능성은 없습니까? T1이 업데이트하기 전에 트랜잭션 T2가 해당 행을 복사하기 시작 했으므로 해당 행에 단독 잠금이 없음을 기억하십시오.

이 상황도 가능하며 데이터를 복사하는 동안 해당 행에 공유 잠금을 설정하지 않으면 어떻게됩니까?

답변

2

(특히 ,이 예제에서는 페이지). 래치는 격리 수준과 무관하게 모든 변경 (비트 수정)을 보호합니다. 따라서 T1이 잠금을 획득하지 못하더라도 읽는 페이지에서 공유 래치를 가져와야합니다. 그렇지 않으면 읽는 바로 그 구조에 대해 수행 된 낮은 수준의 동시 수정의 희생자가됩니다.T2는 페이지 배타적 래치를 얻는 경우에만 수정하는 행을 포함하는 페이지를 수정할 수 있습니다. 따라서 T1은 T2가 수정하기 전에 (따라서 행이 T1이 원하는 행) 또는 행이 완료된 후에 T2가 완료된 후에 행의 이미지 만 볼 수 있습니다. 이제 T1은 이전 행 이미지를 조회해야합니다. version store).

래칭 프로토콜은 커밋되지 않은 읽기 및 버전 관리 된 읽기 (예 : 스냅 샷 및 친구)를 비롯한 모든 격리 수준에서 준수해야합니다.

+0

그래서 어떤 트랜잭션이 데이터를 읽을 때마다 데이터를 읽는 동안 래치 완료 페이지를 획득하고 완료 직후 래치를 해제합니까? – Marka

+0

[Aries 논문의 1.4 장] (http://www.cs.berkeley.edu/~brewer/cs262/Aries.pdf)을 확인하십시오. –

0

READ_COMMITTED_SNAPSHOT/SNAPSHOT ISOLATION을 사용하는 SQL Server가 공유 잠금을 전혀 사용하지 않는다는 의미입니까? 어떻게 가능합니까?

SQL 서버는 모든 어떤 변화를 통해 이동하지 않을 스냅 샷에서 읽고 있기 때문에 가능하다. 현재 트랜잭션 시작시 DB 상태에서 이미 이 고정되어입니다. 다른 프로세스의 커밋되지 않은 트랜잭션은 무시됩니다. 이것은 SQL 서버를 참조하는 거래 tempdb의스냅 샷을 레코드의 (row-versioned) 사본을 지키는 현재 진행중인 데이터/인덱스 페이지 (들)이 변경 얻을 수 있도록함으로써 이루어집니다.

트랜잭션 T2가 커밋되지 않은 데이터를 읽을 가능성이 있습니까? 트랜잭션 T2는 T1이 업데이트하기 전에 해당 행을 복사하기 시작 했으므로 해당 행에 배타적 잠금이 없음을 기억하십시오.

위의 설명은 이미 이것을 설명합니다. 그러나 간체 설명하기 :

시나리오 1 :

T1: begin tran (implicit/explicit) 
T1: read value (4) 
T2: read value (4) -- * 
T1: update value to (8) 

* - This is the committed value at the time the T2 transaction started 

시나리오 2 : 또한 latches 데이터베이스 구조를 보호하기 위해 물리적 거기 논리 잠금 옆

T1: begin tran (implicit/explicit) 
T1: read value (4) 
T1: update value to (8) 
    version of the row with the value (4) is made 
T2: read value (4) -- * from the versioned row 
T1: commit 

* - (4) is [still] the *committed* value at the time the T2 transaction started 
+0

일부 행이 변경 될 때 SNAPSHOT ISOLATION이 Sql Server 복사 8K 페이지에서 켜져있을 때 확신 할 수 없습니다. 데이터베이스 스냅 샷을 참조 할 수 있습니다. 그는 대신 tempdb에 저장된 행 버전을 만듭니다. 해당 행의 모든 ​​업데이트는 원본 페이지에서 이루어집니다. 따라서 select가 데이터 복사를 시작하면 update는 복사 한 것과 동일한 위치로 변경합니다. – Marka

+0

T1이 업데이트를 시작할 때 T2가 적극적으로 행을 읽을 때 제 3의 시나리오에 관심이 있습니다. 이 시나리오가 가능합니까? – Marka

+0

불가능합니다. 행 버전 관리 복사본은 데이터가 업데이트되기 전에 만들어집니다. 어느 시점에서 두 복사본에는 동일한 정보가 포함되어 있으며, 이는 검색 할 스냅 샷 격리 프로세스에 대한 올바른 정보입니다. – RichardTheKiwi