WorkaHolic/MSSQL

MSSQL SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

2010. 2. 25. 16:51
반응형

SET TRANSACTION ISOLATION LEVEL

한 연결에서 실행한 모든 Microsoft SQL Server™ SELECT 문에 대해 기본 트랜잭션 잠금 동작을 제어합니다.

구문

SET TRANSACTION ISOLATION LEVEL 
    { READ COMMITTED 
        | READ UNCOMMITTED 
        | REPEATABLE READ
        | SERIALIZABLE 
    }

인수

READ COMMITTED

데이터를 읽을 때는 공유 잠금이 유지되도록 해서 커밋되지 않은 데이터 읽기가 이루어지지 않도록 지정하지만, 트랜잭션이 끝나기 전에 데이터가 변경되어 반복하지 않는 읽기 또는 팬텀 데이터가 만들어질 수 있습니다. 이 옵션은 SQL Server의 기본값입니다.

READ UNCOMMITTED

불필요한 읽기나 격리 수준 0을 구현합니다. 이렇게 하면 공유 잠금이 만들어지지 않고 단독 잠금이 무시됩니다. 이 옵션을 설정하면 커밋되지 않은 데이터나 불필요한 데이터를 읽을 수 있습니다. 데이터의 값이 변경될 수 있으며 트랜잭션이 끝나기 전에 데이터 집합에 행이 나타나거나 사라질 수도 있습니다. 이 옵션은 트랜잭션에서 모든 SELECT 문의 모든 테이블에 NOLOCK을 설정하는 것과 같습니다. 네 가지 격리 수준 중 제한이 가장 적습니다.

REPEATABLE READ

쿼리에서 사용되는 모든 데이터에 잠금을 배치해 다른 사용자가 데이터를 업데이트할 수 없도록 하지만, 다른 사용자가 데이터 집합에 새 허위 행을 삽입해 현재 트랜잭션의 이후 읽기에 포함될 수 있도록 합니다. 병행성이 기본 격리 수준보다 낮기 때문에 필요할 때만 이 옵션을 사용하도록 하십시오.

SERIALIZABLE

데이터 집합에 범위 잠금을 배치해 트랜잭션이 완료될 때까지 다른 사용자가 행을 업데이트하거나 데이터 집합에 삽입할 수 없도록 합니다. 네 가지 격리 수준 중 제한이 가장 많습니다. 병행성이 더 낮기 때문에 필요할 때만 이 옵션을 사용하도록 하십시오. 이 옵션은 트랜잭션의 모든 SELECT 문의 모든 테이블에 HOLDLOCK을 설정하는 것과 같습니다.

비고

한 번에 한 가지 옵션만 설정할 수 있으며, 명시적으로 변경되기 전까지는 연결에 대해 그 옵션이 적용됩니다. 명령문의 FROM 절에서 테이블 수준에서 최적화 옵션을 지정한 경우를 제외하고 이것이 기본 동작입니다.

SET TRANSACTION ISOLATION LEVEL 옵션은 실행시간이나 런타임에 설정되며, 구문 분석 시간에는 설정되지 않습니다.

예제

다음 예제는 세션에 대해 TRANSACTION ISOLATION LEVEL을 설정합니다. 뒤따르는 각 Transact-SQL 문에 대해 SQL Server는 트랜잭션이 끝날 때까지 모든 공유 잠금을 유지합니다.

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
GO
BEGIN TRANSACTION
SELECT * FROM publishers
SELECT * FROM authors
...
COMMIT TRANSACTION

역시 온라인 설명서다.
저작권 걱정은 여전하다.

입출력이 빈번하게 이루어지는 디비에서
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED를 사용하면
입력이 끝나기를 기다리는 시간을 줄일 수 있다.
자료의 무결성보다 시간이 중요할 때 쓰면 좋을 거 같다.
반응형