쓸만한 주저리

with (READUNCOMMITTED)

봄돌73 2006. 2. 13. 14:24
아래의 업체 소스 중에서 또 발견한 것이다.

with (READUNCOMMITTED)

select 문의 꼬리에 붙었는데 도대체 어디에 쓰는 건지 궁금해졌다.

엠파스 검색 결과 약간의 설명과 ms-sql 도움말을 발견했다.
그래서 그 도움말을 붙인다.
아무래도 저작권에 걸릴 거 같긴 하지만...
설마 이거 가지고 걸까?

잠금 참고

테이블 수준의 잠금 참고 범위는 SELECT, INSERT, UPDATE 및 DELETE 문을 사용하여 Microsoft?? SQL Server™ 2000을 사용할 잠금 유형으로 유도하여 지정할 수 있습니다. 테이블 수준의 잠금 참고는 개체에 대해 얻은 잠금 유형에 대해 더 세부적인 제어가 필요할 때 사용할 수 있습니다. 이러한 잠금 참고는 세션에 대해 현재 트랜잭션 격리 수준을 무시합니다.


참고
   SQL Server 쿼리 최적화 프로그램은 자동으로 적절한 판단을 합니다. 필요할 때만 테이블 수준의 잠금 참고를 사용하여 기본 잠금 동작을 변경하는 것이 좋습니다. 잠금 수준의 허용을 취소하면 동시성에 영향을 줄 수 있습니다.
잠금 참고 설명
HOLDLOCK 필요한 테이블, 행 또는 데이터 페이지가 더 이상 필요 없게 되자마자 해제하지 않고 트랜잭션이 완료될 때까지 공유 잠금을 보유합니다. HOLDLOCK은 SERIALIZABLE과 같은 의미입니다.
NOLOCK 공유 잠금을 실행하거나 단독 잠금을 유지하지 않습니다. 이 옵션을 적용하면 커밋되지 않은 트랜잭션이나 읽는 중 롤백된 페이지 집합을 읽을 수 있습니다. 커밋되지 않은 읽기가 가능합니다. SELECT 명령문에만 적용됩니다.
PAGLOCK 주로 단일 테이블 잠금이 취해지는 곳에서 페이지 잠금을 사용합니다.
READCOMMITTED READ COMMITTED 격리 수준에서 실행되는 트랜잭션과 같은 잠금 방법을 사용하여 스캔을 수행합니다. 기본적으로, SQL Server 2000은 이 격리 수준에서 실행됩니다.
READPAST 잠겨 있는 행을 건너뜁니다. 이 옵션을 사용하면 다른 트랜잭션이 이러한 행에 대해 잠금을 해제할 때까지 기다리지 않고 다른 트랜잭션에 의해 잠겨 있는 행을 건너뜁니다. 그렇지 않으면 일반적으로 결과 집합에 나타납니다. READPAST 잠금 참고는 READ COMMITTED 격리 수준에서 작동하는 트랜잭션에만 적용되며 행 수준 잠금 뒤만 읽습니다. SELECT 문에만 적용됩니다.
READUNCOMMITTED NOLOCK과 같습니다.
REPEATABLEREAD REPEATABLE READ 격리 수준에서 실행되는 트랜잭션과 같은 잠금 방법으로 스캔을 수행합니다.
ROWLOCK 성긴 페이지 잠금 및 테이블 수준의 잠금 대신 행 수준 잠금을 사용합니다.
SERIALIZABLE SERIALIZABLE 격리 수준에서 실행되는 트랜잭션과 같은 잠금 방법으로 스캔을 수행합니다. HOLDLOCK과 같습니다.
TABLOCK 세부적인 행 또는 페이지 수준 잠금 대신 테이블 잠금을 사용합니다. SQL Server는 명령문이 끝날 때까지 이 잠금을 보유합니다. 그러나 HOLDLOCK을 함께 지정했으면 트랜잭션이 끝날 때까지 잠금이 보유됩니다.
TABLOCKX 테이블에 대해 단독 잠금을 사용합니다. 이 잠금을 사용하면 다른 트랜잭션이 테이블을 읽거나 업데이트할 수 없고 명령문이나 트랜잭션이 끝날 때까지 보유됩니다.
UPDLOCK 테이블을 읽는 중 공유 잠금 대신 업데이트 잠금을 사용하며 명령문이나 트랜잭션이 끝날 때까지 보유됩니다. UPDLOCK을 사용하면 다른 트랜잭션이 읽는 것을 차단하지 않고 데이터를 읽을 수 있고 마지막으로 읽은 후 데이터가 변경되지 않으며 나중에 업데이트할 수 있습니다.
XLOCK 명령문에 의해 처리되는 모든 데이터에 대해 트랜잭션이 끝날 때까지 보유될 단독 잠금을 사용합니다. 이 잠금은 PAGLOCK 또는 TABLOCK으로 지정할 수 있으며 이 경우 단독 잠금이 해당 세부성 수준에 적용됩니다.

예를 들어, 트랜잭션 격리 수준이 SERIALIZABLE로 설정되고 테이블 수준 잠금 참고인 NOLOCK이 SELECT 문과 함께 사용되면 일반적으로 키 범위 잠금을 사용하여 순차 가능 트랜잭션이 적용되지 않도록 관리합니다.

USE pubs
GO
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
GO
BEGIN TRANSACTION
SELECT au_lname FROM authors with (NOLOCK)
GO

허가된 잠금은 다음과 같습니다.

EXEC sp_lock
GO
spid dbid ObjId IndId Type Resource Mode Status
1 1 0 0 DB
S GRANT
6 1 0 0 DB
S GRANT
7 1 0 0 DB
S GRANT
8 4 0 0 DB
S GRANT
8 4 0 0 DB
S GRANT
8 4 117575457 0 TAB
Sch-S GRANT
9 4 0 0 DB
S GRANT
9 1 21575115 0 TAB
IS GRANT

SELECT object_name(117575457)
GO
-----------------------------
authors

authors를 참조하는 유일한 잠금은 스키마 안정성(Sch-S) 잠금입니다. 이 경우 순차성은 더 이상 보장되지 않습니다.


'쓸만한 주저리' 카테고리의 다른 글

set nocount on  (0) 2006.02.14
set xact_abort on  (0) 2006.02.14
<base href='url'>  (0) 2006.02.13
<form>에서 <select> 값을 검증할 때  (0) 2006.02.07
모자 주머니가 있는 옷을 입었을 때  (0) 2006.01.09