Microsoft SQL Server
트랜잭션 격리 수준
수색…
통사론
- 트랜잭션 격리 수준 설정 {읽지 못함 | READ COMMITTED | REPEATABLE READ | SNAPSHOT | 직렬화 가능} [; ]
비고
MSDN 참조 : SET TRANSACTION ISOLATION LEVEL
커밋되지 않은 읽기
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
이것은 잠금을 전혀 발생시키지 않는다는 점에서 가장 허용적인 격리 수준입니다. 명령문은 트랜잭션에 기록되었지만 아직 확약되지 않은 행을 포함하여 모든 행을 읽을 수 있음을 지정합니다 (즉, 여전히 트랜잭션 중임). 이 격리 수준은 "더티 읽기"의 영향을받을 수 있습니다.
읽기 커밋 됨
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
이 격리 수준은 두 번째로 가장 관대합니다. 더티 읽기를 방지합니다. READ COMMITTED
의 동작은 READ_COMMITTED_SNAPSHOT
의 설정에 따라 다릅니다.
OFF (기본 설정)로 설정하면 트랜잭션은 공유 잠금을 사용하여 다른 트랜잭션이 현재 트랜잭션이 사용하는 행을 수정하지 못하게하고 현재 트랜잭션이 다른 트랜잭션이 수정 한 행을 읽지 못하게합니다.
ON으로 설정하면
READ COMMITTED
모드에서 실행중인 트랜잭션의 행 버전 관리 대신 공유 잠금을 요청하기 위해READCOMMITTEDLOCK
테이블 힌트를 사용할 수 있습니다.
참고 : READ COMMITTED
가 기본 SQL Server 동작입니다.
"더티 읽기"란 무엇입니까?
더티 읽기 (또는 커밋되지 않은 읽기)는 열린 트랜잭션에 의해 수정되는 행의 읽기입니다.
이 동작은 2 개의 개별 쿼리를 사용하여 복제 할 수 있습니다. 하나는 트랜잭션을 열고 커밋하지 않고 테이블에 데이터를 쓰고 다른 하나는이 격리 수준으로 쓰여지지만 아직 커밋되지 않은 데이터를 선택합니다.
쿼리 1 - 트랜잭션 준비는 완료하지만 완료하지 마십시오.
CREATE TABLE dbo.demo (
col1 INT,
col2 VARCHAR(255)
);
GO
--This row will get committed normally:
BEGIN TRANSACTION;
INSERT INTO dbo.demo(col1, col2)
VALUES (99, 'Normal transaction');
COMMIT TRANSACTION;
--This row will be "stuck" in an open transaction, causing a dirty read
BEGIN TRANSACTION;
INSERT INTO dbo.demo(col1, col2)
VALUES (42, 'Dirty read');
--Do not COMMIT TRANSACTION or ROLLBACK TRANSACTION here
쿼리 2 - 열린 트랜잭션을 포함한 행을 읽습니다.
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SELECT * FROM dbo.demo;
보고:
col1 col2 ----------- --------------------------------------- 99 Normal transaction 42 Dirty read
추신 :이 데모 데이터를 정리하는 것을 잊지 마세요 :
COMMIT TRANSACTION;
DROP TABLE dbo.demo;
GO
반복 읽기
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
이 트랜잭션 격리 수준은 READ COMMITTED
보다 약간 덜 허용됩니다. 공유 잠금은 트랜잭션의 각 문에서 읽은 모든 데이터에 배치되고 각 문 다음에 릴리스되는 것과는 달리 트랜잭션이 완료 될 때까지 유지됩니다.
주 : 필요한 경우에만이 옵션을 사용하십시오. 데이터베이스 성능 저하 및 READ COMMITTED
보다 교착 상태가 발생할 가능성이 높기 때.입니다.
스냅 사진
SET TRANSACTION ISOLATION LEVEL SNAPSHOT
트랜잭션의 모든 명령문에서 읽은 데이터가 트랜잭션 시작시 존재했던 데이터의 트랜잭션 일관성 버전이되도록 지정합니다. 즉, 트랜잭션 시작 전에 커밋 된 데이터 만 읽습니다.
SNAPSHOT
트랜잭션은 트랜잭션이 시작될 때 존재했던 데이터의 버전 (또는 스냅 샷)만을 읽으므로 읽는 데이터에 대한 잠금을 요청하거나 잠금을 발생시키지 않습니다.
SNAPSHOT
격리 수준에서 실행되는 트랜잭션은 실행 중 자체 데이터 변경 내용 만 읽습니다. 예를 들어 트랜잭션은 일부 행을 업데이트 한 다음 업데이트 된 행을 읽을 수 있지만 커밋 될 때까지는 현재 트랜잭션에서만 볼 수 있습니다.
주 : SNAPSHOT
분리 레벨을 사용하려면 ALLOW_SNAPSHOT_ISOLATION
데이터베이스 옵션을 ON으로 설정해야합니다.
직렬화 가능
SET TRANSACTION ISOLATION LEVEL SERIALIZEABLE
이 격리 수준은 가장 제한적인 수준입니다. 트랜잭션의 각 명령문이 읽는 키 값 범위를 범위 잠금에 요청합니다. 이것은 삽입 될 행이 현재 트랜잭션에 의해 잠겨있는 범위에 있으면 다른 트랜잭션의 INSERT
문이 차단된다는 것을 의미합니다.
이 옵션은 트랜잭션의 모든 SELECT
문에있는 모든 테이블에서 HOLDLOCK
을 설정하는 것과 동일한 효과가 있습니다.
주 :이 트랜잭션 분리는 가장 낮은 동시성을 가지며 필요할 때만 사용해야합니다.