다음과 같은 쿼리를 보았을 때 약간의 차단을 조사하고있었습니다.
SELECT SomeField FROM SomeTable NOLOCK
나는이 NOLOCK
쿼리에서 다른 쿼리를 차단하는 방법을 궁금해했습니다 DELETE
. 나는 사용하는 자물쇠를 잠깐 살펴 sp_lock
보았고 여기 내가 본 것입니다 :
DB S GRANT
TAB IS GRANT
PAG S GRANT
이제 내 이해는 NOLOCK
스키마 안정성 잠금 만 사용해야한다는 것 입니다. 왜 IS 잠금을 잡았습니까?
호기심이 생겼습니다. 나는 BOL을 살펴보고 그것을 사용하는 두 가지 방법 WITH (NOLOCK)
과 더 이상 사용되지 않는 것을 보았 (NOLOCK)
으므로 그 시도를하기로 결정했습니다. 다음 쿼리를 실행하고 실행했습니다 sp_lock
.
SELECT SomeField FROM SomeTable WITH (NOLOCK)
DB S GRANT 탭 Sch-S GRANT
SELECT SomeField FROM SomeTable (NOLOCK)
DB S GRANT 탭 Sch-S GRANT
물론 스키마 안정성 잠금이 있습니다. 제 질문은 이것입니다 : 여기서 무슨 일이 일어나고 있습니까? NOLOCK을 사용하는 데 허용되는 구문이 WITH (NOLOCK)
또는 (NOLOCK)
인 NOLOCK
경우 괄호없이 일반으로 실행하면 쿼리 오류가 발생하지 않는 이유는 무엇입니까? 지원되는 경우 IS 잠금을 잡는 이유는 무엇입니까? 내가 여기서 무엇을 놓치고 있습니까? 답변을 온라인에서 검색했지만 지금까지는 부족했습니다.
2008R2와 2012에서 모두 테스트했습니다.
SELECT SomeField FROM SomeTable NOLOCK (NOLOCK)
double nolock effect;)