메모리 최적화 테이블에 액세스하는 트랜잭션에 대해 다음과 같은 격리 수준이 지원됩니다.
스냅 사진
반복 가능한 읽기
직렬화 가능
읽기 커밋됨
트랜잭션 격리 수준은 고유하게 컴파일된 저장 프로시저의 원자성 블록의 일부로 지정할 수 있습니다. 자세한 내용은 CREATE PROCEDURE(Transact-SQL)를 참조하세요. 해석된 Transact-SQL에서 메모리 최적화 테이블에 액세스하는 경우 테이블 수준 힌트를 사용하여 격리 수준을 지정할 수 있습니다.
고유하게 컴파일된 저장 프로시저를 정의할 때 트랜잭션 격리 수준을 지정해야 합니다. 해석된 Transact-SQL의 사용자 트랜잭션에서 메모리 최적화 테이블에 액세스할 때 테이블 힌트에서 격리 수준을 지정해야 합니다. 자세한 내용은 Memory-Optimized 테이블을 사용한 트랜잭션 격리 수준에 대한 지침을 참조하세요.
격리 수준 READ COMMITTED는 자동 커밋 트랜잭션이 있는 메모리 최적화 테이블에 대해 지원됩니다. READ COMMITTED는 사용자 트랜잭션 또는 원자성 블록에서 유효하지 않습니다. READ COMMITTED는 명시적 또는 암시적 사용자 트랜잭션에서 지원되지 않습니다. 격리 수준 READ_COMMITTED_SNAPSHOT 자동 커밋 트랜잭션이 있는 메모리 최적화 테이블에 대해 지원되며 쿼리가 디스크 기반 테이블에 액세스하지 않는 경우에만 지원됩니다. 또한 SNAPSHOT 격리에서 해석된 Transact-SQL 사용하여 시작된 트랜잭션은 메모리 최적화 테이블에 액세스할 수 없습니다. REPEATABLE READ 또는 SERIALIZABLE 격리를 사용하여 해석된 Transact-SQL 사용하는 트랜잭션은 SNAPSHOT 격리를 사용하여 메모리 최적화 테이블에 액세스해야 합니다. 이 시나리오에 대한 자세한 내용은 컨테이너 간 트랜잭션을 참조하세요.
READ COMMITTED는 SQL Server의 기본 격리 수준입니다. 세션의 격리 수준이 READ COMMITED(또는 그 이하)인 경우 다음 중 하나를 수행할 수 있습니다.
메모리 최적화 테이블(예: WITH(SNAPSHOT))에 액세스하기 위해 더 높은 격리 수준 힌트를 명시적으로 사용합니다.
메모리 최적화 테이블의 격리 수준을 SNAPSHOT으로 설정하려면
MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT설정 옵션을 지정하십시오. 이는 모든 메모리 최적화 테이블에 WITH(SNAPSHOT) 힌트를 포함한 것과 같습니다. 자세한MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT내용은 ALTER DATABASE SET 옵션(Transact-SQL)을 참조하세요.
또는 세션의 격리 수준이 READ COMMITTED인 경우 자동 커밋 트랜잭션을 사용할 수 있습니다.
해석된 Transact-SQL에서 시작된 SNAPSHOT 트랜잭션은 메모리 최적화 테이블에 액세스할 수 없습니다.
메모리 최적화 테이블에 대해 지원되는 트랜잭션 격리 수준은 디스크 기반 테이블과 동일한 논리적 보증을 제공합니다. 격리 수준 보장을 제공하는 데 사용되는 메커니즘은 다릅니다.
디스크 기반 테이블의 경우 대부분의 격리 수준 보장은 잠금을 사용하여 구현되어 차단을 통한 충돌을 방지합니다. 메모리 최적화 테이블의 경우 충돌 검색 메커니즘을 사용하여 보장을 적용하므로 잠금을 해제할 필요가 없습니다. 디스크 기반 테이블의 SNAPSHOT 격리는 예외입니다. 충돌 검색 메커니즘을 사용하여 메모리 최적화 테이블의 SNAPSHOT 격리와 유사하게 구현됩니다.
스냅 사진
이 격리 수준은 트랜잭션의 어떤 명령문에서 읽은 데이터가 트랜잭션 시작 시 존재했던 데이터의 트랜잭션적으로 일관된 버전이 되도록 제공하도록 명시합니다. 트랜잭션은 트랜잭션이 시작되기 전에 커밋된 데이터 수정만 인식할 수 있습니다. 현재 트랜잭션이 시작된 후 다른 트랜잭션에서 수정한 데이터는 현재 트랜잭션에서 실행되는 문에 표시되지 않습니다. 트랜잭션의 문장은 트랜잭션 시작 시 존재했던 커밋된 데이터의 스냅샷을 얻습니다.
쓰기 작업(업데이트, 삽입 및 삭제)은 항상 다른 트랜잭션과 완전히 격리됩니다. 따라서 SNAPSHOT 트랜잭션의 쓰기 작업은 다른 트랜잭션의 쓰기 작업과 충돌할 수 있습니다. 현재 트랜잭션이 현재 트랜잭션이 시작된 후 커밋된 다른 트랜잭션에 의해 업데이트되거나 삭제된 행을 업데이트하거나 삭제하려고 하면 트랜잭션이 다음 오류 메시지와 함께 종료됩니다.
오류 41302. 현재 트랜잭션이 이 트랜잭션이 시작된 이후 업데이트된 테이블 X의 레코드를 업데이트하려고 했습니다. 트랜잭션이 중단되었습니다.
현재 트랜잭션이 현재 트랜잭션 전에 커밋된 다른 트랜잭션에 의해 삽입된 행과 동일한 기본 키 값을 가진 행을 삽입하려고 하면 다음 오류 메시지와 함께 커밋하지 못한 것입니다.
오류 41325. 직렬화 가능한 유효성 검사 실패로 인해 현재 트랜잭션을 커밋하지 못했습니다.
트랜잭션이 커밋하기 전에 삭제된 테이블에 쓰면 트랜잭션이 다음 오류 메시지와 함께 종료됩니다.
오류 41305. 반복 가능한 읽기 유효성 검사 실패로 인해 현재 트랜잭션을 커밋하지 못했습니다.
반복 가능한 읽기
이 격리 수준에는 SNAPSHOT 격리 수준에서 제공하는 보장이 포함됩니다. 또한 REPEATABLE READ는 트랜잭션에서 읽은 모든 행에 대해 트랜잭션이 커밋할 때 행이 다른 트랜잭션에 의해 변경되지 않도록 보장합니다. 트랜잭션의 모든 읽기 작업은 트랜잭션이 끝날 때까지 반복할 수 있습니다.
현재 트랜잭션이 현재 트랜잭션 전에 커밋된 다른 트랜잭션에 의해 업데이트된 행을 읽은 경우 다음 오류 메시지와 함께 커밋이 실패합니다.
오류 41305. 반복 가능한 읽기 유효성 검사 실패로 인해 현재 트랜잭션을 커밋하지 못했습니다.
직렬화 가능
이 격리 수준에는 REPEATABLE READ에서 제공하는 보장이 포함됩니다. 스냅샷과 트랜잭션의 끝 사이에 가상 행이 나타나지 않았습니다. 가상 행은 선택, 업데이트 또는 삭제의 필터 조건과 일치합니다.
트랜잭션은 동시 트랜잭션이 없는 것처럼 실행됩니다. 모든 작업은 사실상 단일 serialization 지점(커밋 시간)에서 발생합니다.
이러한 보장을 위반하면 트랜잭션이 다음 오류 메시지와 함께 커밋되지 않습니다.
오류 41325. 직렬화 가능한 유효성 검사 실패로 인해 현재 트랜잭션을 커밋하지 못했습니다.
또한 참조하십시오
Memory-Optimized 테이블의 트랜잭션 이해
Memory-Optimized 테이블을 사용하여 트랜잭션 격리 수준에 대한 지침
Memory-Optimized 테이블의 트랜잭션에 대한 재시도 논리에 대한 지침