단일 트랜잭션에서 동일한 레코드를 여러 번 업데이트하는 경우 몇 개의 버전이 저장됩니까?


11

Kimberly L. Tripp의 MSDN 기사에 따르면 Neal Graves의 " SQL Server 2005 행 버전 관리 기반 트랜잭션 격리

  • "... 특정 레코드의 모든 이전 버전은 링크 된 목록으로 연결되며, 행 버전 관리 기반의 장기 실행 트랜잭션의 경우 트랜잭션에 일관된 버전에 도달하려면 각 액세스 에서 링크를 순회해야합니다. 행"

"행 버전 관리를 사용하여 커밋 된 읽기의 행 버전 관리"및 "스냅 샷 격리의 행 버전 관리"섹션에 공통적 인 "행 버전 관리 이해"섹션에 있습니다.

또한 수정으로 인한 행 버전 관리의 예는 SNAPSHOT의 여러 트랜잭션 (T1, T2, T3)에 의해 동일한 레코드의 여러 업데이트와 관련하여 제공됩니다.

하나의 트랜잭션 만 여러 번 (다수의 명령문으로) 레코드를 업데이트하는 경우, 여러 버전 저장소가 저장 (링크)되거나 SNAPSHOT "이미지"가 찍힌 순간에 저장된 것만 저장됩니까?

글쎄,이 질문에 대한 답변은 즉시 보류중인 다른 관련 질문에 대답해야합니다.

답변:


11

단일 트랜잭션에서 동일한 레코드를 여러 번 업데이트하는 경우 몇 개의 버전이 저장됩니까?

딱 하나만.

행에 대한 첫 번째 업데이트는 행 버전을 생성하고 독점적으로 행을 잠급니다. 같은 트랜잭션 내에서 같은 행으로 나중에 업데이트해도 새 행 버전이 생성되지 않습니다.


행 버전의 링크 된 목록은 다음과 같이 발생할 수 있습니다.

  • SNAPSHOT 트랜잭션의 트랜잭션 T1은 행을 읽고 값 'a'를 봅니다.

  • 트랜잭션 T2 (모든 격리 수준에서)는 값을 'a'에서 'b'로 업데이트하고 커밋합니다. 값 'a'에 대한 행 버전을 생성합니다.

  • 트랜잭션 T3 (모든 격리 수준에서)은 값을 'b'에서 'c'로 업데이트하고 커밋합니다. 값 'b'에 대한 행 버전을 생성합니다. 이 행 버전은 'a'의 이전 행 버전에 연결됩니다.

  • 트랜잭션 T1은 현재 페이지 ( 'c')에 저장된 값에서 행 버전 'b'로 링크 한 다음 다시 행 버전 'a'로 링크를 순회하여 행 값을 읽습니다.

행 버전은 기존 읽기 트랜잭션이 있는지 여부에 관계없이 데이터 변경에 의해 생성됩니다 (모든 격리 수준). 버전은 절대 필요하지 않지만 여전히 생성됩니다. 트랜잭션 T1 없이도 동일한 링크 된 버전 목록이 생성됩니다.

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