본문 바로가기
㏈ª By β┖υΕJini/MS-SQL

잠금 힌트 - WITH

by ㏈ª ☞ β┖υΕJini.κR 2009. 10. 30.
사용자 삽입 이미지

1. 조회 속도성능을
높이기 위해서

해당 범위의 Row들에 대해서 Dirty Read를 하여도 괜찮은 경우에 사용합니다.

with (nolock)

2. 자기가 조회한 로우를
다른 트랜잭션이 변경할 수
없게 하기 위해

업데이트 목적을 갖지 않는 다른 트랜잭션의 읽기(nolock 또는 힌트가 없는 Select)는 허용하지만 Select한 로우에 대한 업데이트를 방지합니다.
업데이트 목적을 갖는 다른 트랜잭션의 읽기(updlock 힌트를 사용하는 Select)를 허용하지 않습니다.
updlock 2이상 사용될 경우 후속 트랜잭션에서 대기 상태에 들어갑니다.

with (updlock)

3. 자기가 조회한 로우를
다른 트랜잭션에서 읽어갈
수 없게 하기 위해

nolock 힌트를 제외한 다른 트랜잭션에서의 모든 읽기가 방지됩니다.
해당 로우에 대해서 다른 트랜잭션에서 업데이트를 할 수 없습니다.
해당 로우에 접근하는 후속 트랜잭션은 대기 상태에 들어갑니다.

with (rowlock xlock)

4. 읽기 잠금을 제외한
로우를 조회하고자 할 때

rowlock xlock 힌트에서 잠근 행을 제외한 행들을 읽어 갈 수 있습니다.
xlock
힌트와 함께 사용하면 읽어온 행들에 대해서 읽기 잠금이 발생하여 시나리오#3과 동일한 효과를 가집니다.
xlock이 함께 사용되는 경우 해당 로우에 접근하는 후속 트랜잭션은 대기 상태에 들어갑니다.

with (readpast)
with (readpast xlock)

5. 자기가 조회한 로우를
다른 트랜잭션이 변경할 수
없게 하기 위해
자기가 조회하는 테이블에
다른 트랜잭션에서 인서트를 할 수 없게 하기 위해

업데이트 목적을 갖지 않는 다른 트랜잭션의 읽기(nolock 또는 힌트가 없는 Select)는 허용하지만 Table 전체에 업데이트를 방지하고자 할 때
업데이트 목적을 갖는 다른 트랜잭션의 읽기(updlock 힌트를 사용하는 Select)를 허용하지 않으려고 할 때
인서트를 방지하면서 조회하는 로우만 업데이트 방지를 할 수 있는 힌트는 없습니다.
인서트 방지 목적을 갖는 다른 트랜잭션의 읽기(holdlock tablock 힌트를 사용하는 Select)가 허용되므로 Deadlock이 발생할 가능성이 있습니다.

with (holdlock tablock)

6. 시나리오 5. 에 대한 Deadlock을 방지하고자
할 때

다른 트랜잭션에서 해당 테이블에 대한 모든 select, update, insert 구문의 실행을 방지하고자 할 때
쿼리의 유형과 관계 없이 이 테이블에 접근하는 다른 트랜잭션은 대기 상태에 들어갑니다.

with (tablockx