다음을 통해 공유


컨테이너 간 트랜잭션

컨테이너 간 트랜잭션은 고유하게 컴파일된 저장 프로시저 또는 메모리 최적화 테이블에 대한 작업에 대한 호출을 포함하는 암시적 또는 명시적 사용자 트랜잭션입니다.

SQL Server에서 저장 프로시저 호출은 트랜잭션을 시작하지 않습니다. 사용자 트랜잭션의 컨텍스트가 아닌 자동 커밋 모드에서 고유하게 컴파일된 프로시저의 실행은 컨테이너 간 트랜잭션으로 간주되지 않습니다.

메모리 최적화 테이블을 참조하는 해석된 쿼리는 명시적 또는 암시적 트랜잭션 또는 자동 커밋 모드에서 실행되는지 여부에 관계없이 컨테이너 간 트랜잭션의 일부로 간주됩니다.

개별 작업의 격리

각 SQL Server 트랜잭션에는 격리 수준이 있습니다. 기본 격리 수준은 리드 커밋입니다. 다른 격리 수준을 사용하려면 SET TRANSACTION ISOLATION LEVEL(Transact-SQL)을 사용하여 격리 수준을 설정할 수 있습니다.

디스크 기반 테이블의 작업과는 다른 격리 수준에서 메모리 최적화 테이블에 대한 작업을 수행해야 하는 경우가 많습니다. 트랜잭션에서는 문 컬렉션 또는 개별 읽기 작업에 대해 다른 격리 수준을 설정할 수 있습니다.

개별 작업의 격리 수준 지정

트랜잭션 내의 문 집합에 대해 다른 격리 수준을 설정하려면 SET TRANSACTION ISOLATION LEVEL를 사용하십시오. 트랜잭션의 다음 예제에서는 직렬화 가능한 격리 수준을 기본값으로 사용합니다. t3, t2 및 t1에 대한 삽입 및 선택 작업은 반복 가능한 읽기 격리에서 실행됩니다.

set transaction isolation level serializable  
go  
  
begin transaction  
 ......  
  set transaction isolation level repeatable read  
  
  insert t3 select * from t1 join t2 on t1.id=t2.id  
  
  set transaction isolation level serializable  
 ......  
commit  

트랜잭션 기본값과 다른 개별 읽기 작업에 대한 격리 수준을 설정하려면 테이블 힌트(예: serialize 가능)를 사용할 수 있습니다. 모든 선택 항목은 읽기 작업에 해당하며 모든 업데이트 및 모든 삭제는 읽기에 해당합니다. 행을 업데이트하거나 삭제하기 전에 항상 읽어야 하기 때문입니다. 쓰기는 항상 SQL Server에서 격리되므로 삽입 작업에는 격리 수준이 없습니다. 다음 예제에서는 트랜잭션의 기본 격리 수준이 읽기 커밋됨이지만, 테이블 t1은 직렬화 가능 방식으로, t2는 스냅샷 격리 방식으로 액세스됩니다.

set transaction isolation level read committed  
go  
  
begin transaction  
 ......  
  
  insert t3 select * from t1 (serializable) join t2 (snapshot) on t1.id=t2.id  
  
  ......  
commit  

개별 작업에 대한 격리 의미 체계

직렬화할 수 있는 트랜잭션 T는 완전히 격리된 상태로 실행됩니다. T가 시작되기 전에 다른 모든 트랜잭션이 커밋되었거나 T 커밋 후에 시작되는 것처럼 표시됩니다. 트랜잭션의 여러 작업에 다른 격리 수준이 있는 경우 더 복잡해집니다.

SQL Server의 트랜잭션 격리 수준에 대한 일반적인 의미 체계와 잠금에 대한 의미는 SET TRANSACTION ISOLATION LEVEL(Transact-SQL)에 설명되어 있습니다.

다른 작업에서 격리 수준이 다를 수 있는 컨테이너 간 트랜잭션의 경우 개별 읽기 작업의 격리 의미 체계를 이해해야 합니다. 쓰기 작업은 항상 격리됩니다. 서로 다른 트랜잭션 간의 쓰기가 서로에게 영향을 주지 않습니다.

데이터 읽기 작업은 필터 조건을 충족하는 여러 행을 반환합니다.

읽기는 트랜잭션 T의 일부로 수행됩니다. 읽기 작업에 대한 격리 수준은 다음과 같이 이해할 수 있습니다.

커밋 상태
커밋 상태는 데이터 읽기가 커밋되도록 보장되는지 여부를 나타냅니다.

(트랜잭션) 일관성
읽기 집합에 대한 트랜잭션 일관성은 읽은 행 버전이 모두 정확히 동일한 트랜잭션 집합의 업데이트를 포함하도록 보장되는지 여부를 나타냅니다.

시스템이 트랜잭션 T에게 읽은 데이터에 관하여 제공하는 안정성 보장.
안정성은 트랜잭션의 읽기를 반복할 수 있는지 여부를 나타냅니다. 즉, 읽기가 반복되면 동일한 행과 행 버전을 반환할까요?

특정 보장은 트랜잭션의 논리적 종료 시간을 나타냅니다. 일반적으로 논리적 종료 시간은 트랜잭션이 데이터베이스에 커밋되는 시간입니다. 트랜잭션에서 메모리 최적화 테이블에 액세스하는 경우 논리적 종료 시간은 기술적으로 유효성 검사 단계의 시작입니다. 자세한 내용은 Memory-Optimized 테이블의 거래에 관한 토론을 참조하세요.

격리 수준에 관계없이 트랜잭션(T)은 항상 자체 업데이트를 봅니다.

커밋되지 않은 상태에서 읽기
읽은 데이터는 커밋되지 않거나 일관되지 않거나 안정적이지 않을 수 있습니다. 그러나 T에서 수행한 이전 쓰기 작업이 포함됩니다.

읽기 커밋됨
읽은 데이터가 커밋됩니다.

스냅 사진
스냅샷 격리에서 T가 수행하는 모든 읽기 작업에는 트랜잭션의 시작 부분인 동일한 논리적 읽기 시간이 있습니다. 데이터 읽기는 논리적 읽기 시간을 기준으로 커밋되고 일관되도록 보장됩니다. 원래 읽기 시간을 기준으로 읽기를 반복하면 동일한 결과가 반환됩니다.

반복 가능한 읽기
데이터 읽기는 트랜잭션의 논리적 종료 시간까지 커밋되고 안정적으로 유지됩니다.

직렬화 가능
T에 의해 수행된 직렬화 가능한 모든 읽기 작업에 대해 REPEATABLE READ 뿐만 아니라 팬텀 회피와 트랜잭션 일관성을 보장합니다. 팬텀 회피라는 것은 검사 작업이 T에 의해 작성된 추가 행만 반환할 수 있고 다른 트랜잭션에 의해 작성된 행은 반환할 수 없음을 의미합니다.

다음 트랜잭션을 고려합니다.

set transaction isolation level read committed  
go  
  
begin transaction  
  -- remove all rows from t3; the related read operation is performed under read committed   
  -- isolation, as this is the default for the transaction  
  delete from t3  
  
  -- copy the contents from t1 to t3; the read on t1 is performed under the serializable   
  -- isolation level  
  insert t3 select * from t1 (serializable)  
  
  -- compare t3 and t1; note: the result set may not be empty, as rows may have been added   
  -- by other transaction before this select, due to the read committed isolation level  
  select * from t3 except t1  
  
  -- compare t1 and t3; note: the result set is empty, as no rows have been added to t1   
  -- since its contents were copied to t1, due to the serializable isolation level  
  select * from t1 except t3  
commit  

이 트랜잭션은 커밋된 읽기 격리에서 t3의 모든 행을 삭제하고, 직렬화 가능한 격리에서 t1에서 t3으로 모든 행을 복사한 다음, t1과 t3을 비교합니다. 테이블이 비워진 후 t1에 포함되지 않는 일부 행이 t3에 추가되었을 수 있습니다. 복사본을 직렬화할 수 있으므로 t1에 행이 추가되지 않았습니다.

트랜잭션이 끝날 때 t1에서 읽은 내용은 커밋된 구문으로 읽지만, 직렬화 가능한 격리 하에 트랜잭션의 앞부분에서 동일한 읽기가 수행되었기 때문에 실제로 직렬화할 수 있습니다. 직렬화 기능은 트랜잭션의 이후 지점에서 읽기가 수행되는 경우 동일한 행이 반환되도록 보장합니다.

컨테이너 간 트랜잭션 및 격리 수준

컨테이너 간 트랜잭션은 디스크 기반 쪽(디스크 기반 테이블 작업용) 및 메모리 최적화 쪽(메모리 최적화 테이블의 작업용)의 두 가지 측면이 있는 것으로 볼 수 있습니다. 이 두 면은 서로 다른 격리 수준을 가질 수 있습니다. 실제로 각 측의 개별 읽기 작업은 서로 다른 격리 수준을 가질 수 있습니다.

다음 조건 중 하나가 충족되면 지정된 트랜잭션 T의 디스크 기반 쪽이 특정 격리 수준 X에 도달합니다.

  • 시작 지점은 X입니다. 즉, 실행한 SET TRANSACTION ISOLATION LEVEL 때문에 세션 기본값이 X이거나, 아니면 SQL Server의 기본값입니다.

  • 트랜잭션 중에 기본 격리 수준은 .를 사용하여 SET TRANSACTION ISOLATION LEVELX로 변경됩니다.

  • 디스크 기반 테이블에 대한 읽기 작업은 구문을 WITH (X)사용하여 격리 수준 X에서 실행됩니다.

T를 실행하는 동안 메모리 최적화 테이블 또는 고유하게 컴파일된 저장 프로시저에 대한 읽기 작업이 격리 수준 Y에서 실행되는 경우 T의 메모리 최적화 쪽은 격리 수준 Y에 도달합니다.

다음 트랜잭션을 예로 들어 보세요. 여기서 t1 및 t2는 디스크 기반 테이블이고 t3 및 t4는 메모리 최적화 테이블입니다.

트랜잭션의 디스크 기반 쪽은 읽기 커밋 격리 수준에 도달합니다. 이는 해당 수준에서 시작되기 때문입니다. 첫 번째 읽기 작업은 해당 격리 수준에서 실행되므로 디스크 기반 쪽도 반복 가능한 읽기에 도달합니다. 트랜잭션의 끝에 있는 삭제는 커밋된 읽기 격리 수준에서 실행되므로 새 격리 수준이 발생하지 않습니다.

트랜잭션의 메모리 최적화 쪽은 두 수준 중 하나에 도달할 수 있습니다. condition1이 true이면 직렬화 가능에 도달하지만 false이면 메모리 최적화 쪽은 스냅샷 격리에만 도달합니다.

set transaction isolation level read committed  
go  
  
begin transaction  
  select * from t1 (repeatableread)  
  
  if condition1 begin  
    insert t3 select * from t4 (serializable)  
  end  
  else begin  
    insert t3 select * from t4 (snapshot)  
  end  
  
  delete from t1  
commit  

컨테이너 간 트랜잭션에 대해 지원되는 격리 수준

컨테이너 간 트랜잭션의 메모리 최적화 테이블에 대한 작업과 함께 사용되는 격리 수준에는 제한이 있습니다.

메모리 최적화 테이블은 격리 수준 SNAPSHOT, REPEATABLE READ 및 SERIALIZABLE을 지원합니다. 자동 커밋 트랜잭션의 경우 메모리 최적화 테이블은 격리 수준 READ COMMITTED를 지원합니다.

지원되는 시나리오는 다음과 같습니다.

  • READ UNCOMMITTED, READ COMMITTED 및 READ_COMMITTED_SNAPSHOT 크로스 컨테이너 트랜잭션은 SNAPSHOT, REPEATABLE READ 및 SERIALIZABLE 격리에서 메모리 최적화 테이블에 액세스할 수 있습니다. READ COMMITTED 보증은 트랜잭션에 대해 유지됩니다. 트랜잭션에서 읽은 모든 행이 데이터베이스에 커밋되었습니다.

  • REPEATABLE READ 및 SERIALIZABLE 트랜잭션은 SNAPSHOT 격리에서 메모리 최적화 테이블에 액세스할 수 있습니다.

읽기 전용 컨테이너 간 트랜잭션

SQL Server의 대부분의 읽기 전용 트랜잭션은 커밋 시 롤백됩니다. 데이터베이스에 커밋할 변경 내용이 없으므로 시스템은 트랜잭션에서 사용하는 리소스를 해제하기만 하면 됩니다. 읽기 전용 디스크 기반 트랜잭션의 경우 트랜잭션에서 수행한 모든 잠금이 현재 해제됩니다. 고유하게 컴파일된 단일 프로시저 실행에 걸쳐 있는 읽기 전용 메모리 최적화 트랜잭션의 경우 유효성 검사가 수행되지 않습니다.

자동 커밋 모드의 컨테이너 간 읽기 전용 트랜잭션은 트랜잭션이 끝날 때 롤백됩니다. 유효성 검사가 수행되지 않습니다.

트랜잭션이 REPEATABLE READ 또는 SERIALIZABLE 격리 수준에서 메모리 최적화 테이블에 액세스하는 경우, 명시적 혹은 암시적 컨테이너 간의 읽기 전용 트랜잭션은 커밋 시점에 유효성 검사를 수행합니다. 유효성 검사에 대한 자세한 내용은 Memory-Optimized 테이블의 트랜잭션에서 충돌 검색, 유효성 검사 및 커밋 종속성 검사 섹션을 참조하세요.

또한 참조하십시오

Memory-Optimized 테이블의 트랜잭션 이해
Memory-Optimized 테이블을 사용하여 트랜잭션 격리 수준에 대한 지침
Memory-Optimized 테이블의 트랜잭션에 대한 재시도 논리에 대한 지침