(NOLOCK) vs NOLOCK


24

다음과 같은 쿼리를 보았을 때 약간의 차단을 조사하고있었습니다.

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에서 모두 테스트했습니다.


4
SELECT SomeField FROM SomeTable NOLOCK (NOLOCK)double nolock effect;)
ypercubeᵀᴹ

답변:


52
SELECT SomeField
FROM   SomeTable NOLOCK 

가 방금 별칭을 설정했음을 의미합니다 SomeTable AS NOLOCK. 이것을 명확하게 보려면 아래를 시도하십시오.

SELECT NOLOCK.SomeField
FROM   SomeTable NOLOCK 

이것은 분명히 쿼리의 잠금 동작에 영향을 미치지 않습니다. SSMS에서 키워드 및 파란색으로 표시되어 있음에도 불구하고 쿼리는 실패하지 않습니다. NOLOCK은 Transact-SQL에서 예약어 가 아니므로 구문 오류가 발생하지 않습니다. 예약어 목록 : https://msdn.microsoft.com/en-us/library/ms189822.aspx

힌트로 사용하기위한 올바른 구문 :

  • (NOLOCK) 유효하지만 더 이상 사용되지 않습니다.
  • WITH (NOLOCK) 권장되는 구문입니다.

14
와우, 내가 어떻게 알아 내지 못했는지 모르겠습니다. 그것은 정말로 나를 미치게했다, 지금 나는 단지 당황하게 느낀다 :) 때때로 가장 간단한 일이다.
Brian

2
@Brian 걱정하지 마십시오. 최근에 비슷한 것을 디버깅해야했습니다. 그렇지 않으면 쉽게 찾을 수 없었습니다! MS가 그 구문을 더 이상 사용하지 않는 이유를 알 수 있습니다.
Gareth Lyons

NOLOCK은 예약 키워드가 아닙니까? [NOLOCK]을 사용하지 않으면 불평하지 않습니까?
Aaroninus

6
Noms msdn.microsoft.com/ko-kr/library/ms189822.aspx SSMS에 파란색으로 표시되어 있어도 문제가 발생할 수 있습니다.
Gareth Lyons

캐치, LOL. 오늘 가장 좋아하는 Q / A.
RBarryYoung 17 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.