수색…


통사론

  • 트랜잭션 격리 수준 설정 {읽지 못함 | READ COMMITTED | REPEATABLE READ | SNAPSHOT | 직렬화 가능} [; ]

비고

MSDN 참조 : SET TRANSACTION ISOLATION LEVEL

커밋되지 않은 읽기

SQL Server 2008 R2
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

이것은 잠금을 전혀 발생시키지 않는다는 점에서 가장 허용적인 격리 수준입니다. 명령문은 트랜잭션에 기록되었지만 아직 확약되지 않은 행을 포함하여 모든 행을 읽을 수 있음을 지정합니다 (즉, 여전히 트랜잭션 중임). 이 격리 수준은 "더티 읽기"의 영향을받을 수 있습니다.

읽기 커밋 됨

SQL Server 2008 R2
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

반복 읽기

SQL Server 2008 R2
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ

이 트랜잭션 격리 수준은 READ COMMITTED 보다 약간 덜 허용됩니다. 공유 잠금은 트랜잭션의 각 문에서 읽은 모든 데이터에 배치되고 각 문 다음에 릴리스되는 것과는 달리 트랜잭션이 완료 될 때까지 유지됩니다.

주 : 필요한 경우에만이 옵션을 사용하십시오. 데이터베이스 성능 저하 및 READ COMMITTED 보다 교착 상태가 발생할 가능성이 높기 때.입니다.

스냅 사진

SQL Server 2008 R2
SET TRANSACTION ISOLATION LEVEL SNAPSHOT

트랜잭션의 모든 명령문에서 읽은 데이터가 트랜잭션 시작시 존재했던 데이터의 트랜잭션 일관성 버전이되도록 지정합니다. 즉, 트랜잭션 시작 전에 커밋 된 데이터 만 읽습니다.

SNAPSHOT 트랜잭션은 트랜잭션이 시작될 때 존재했던 데이터의 버전 (또는 스냅 샷)만을 읽으므로 읽는 데이터에 대한 잠금을 요청하거나 잠금을 발생시키지 않습니다.

SNAPSHOT 격리 수준에서 실행되는 트랜잭션은 실행 중 자체 데이터 변경 내용 만 읽습니다. 예를 들어 트랜잭션은 일부 행을 업데이트 한 다음 업데이트 된 행을 읽을 수 있지만 커밋 될 때까지는 현재 트랜잭션에서만 볼 수 있습니다.


주 : SNAPSHOT 분리 레벨을 사용하려면 ALLOW_SNAPSHOT_ISOLATION 데이터베이스 옵션을 ON으로 설정해야합니다.

직렬화 가능

SQL Server 2008 R2
SET TRANSACTION ISOLATION LEVEL SERIALIZEABLE

이 격리 수준은 가장 제한적인 수준입니다. 트랜잭션의 각 명령문이 읽는 키 값 범위를 범위 잠금에 요청합니다. 이것은 삽입 될 행이 현재 트랜잭션에 의해 잠겨있는 범위에 있으면 다른 트랜잭션의 INSERT 문이 차단된다는 것을 의미합니다.

이 옵션은 트랜잭션의 모든 SELECT 문에있는 모든 테이블에서 HOLDLOCK 을 설정하는 것과 동일한 효과가 있습니다.


주 :이 트랜잭션 분리는 가장 낮은 동시성을 가지며 필요할 때만 사용해야합니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow