(NOLOCK) vs NOLOCK

24

Badałem pewne blokowanie, gdy zobaczyłem zapytanie, które wyglądało mniej więcej tak:

SELECT SomeField FROM SomeTable NOLOCK

Widziałem NOLOCKi byłem ciekawy, jak może blokować inne zapytania, w tym przypadku DELETEoświadczenia. Rzuciłem okiem na zamki sp_locki oto, co zobaczyłem:

DB      S   GRANT

TAB     IS  GRANT

PAG    S    GRANT

Rozumiem teraz, że NOLOCKpowinien on zabierać tylko blokadę stabilności schematu, dlaczego więc chwytał blokadę IS?

Moja ciekawość była rozbudzona. Spojrzałem na BOL i zobaczyłem, że istnieją dwa sposoby korzystania z niego, WITH (NOLOCK)i są przestarzałe (NOLOCK), więc postanowiłem spróbować. Uruchomiłem następujące zapytania, a następnie uruchomiłem sp_lock:

SELECT SomeField FROM SomeTable WITH (NOLOCK)
DB S GRANT

DOTACJA TAB Sch-S
SELECT SomeField FROM SomeTable (NOLOCK)
DB S GRANT

DOTACJA TAB Sch-S

Rzeczywiście, są moje blokady stabilności schematu. Więc moje pytanie brzmi: co się tutaj dzieje? Jeśli akceptowana składnia za korzystanie NOLOCK jest albo WITH (NOLOCK)albo (NOLOCK), to dlaczego nie błąd zapytania, kiedy uruchamia się po prostu NOLOCK(bez nawiasów)? Jeśli jest obsługiwany, dlaczego chwyta blokadę IS? Czego tu brakuje? Szukałem odpowiedzi online, ale jak dotąd nie znalazłem odpowiedzi.

Testowałem to zarówno w 2008R2, jak i 2012.

Brian
źródło
4
SELECT SomeField FROM SomeTable NOLOCK (NOLOCK)dla efektu podwójnego nolocka;)
ypercubeᵀᴹ

Odpowiedzi:

52
SELECT SomeField
FROM   SomeTable NOLOCK 

oznacza, że ​​właśnie zostałeś alias SomeTable AS NOLOCK. Spróbuj poniżej, aby zobaczyć to wyraźnie:

SELECT NOLOCK.SomeField
FROM   SomeTable NOLOCK 

Nie ma to oczywiście wpływu na zachowanie blokowania zapytania. Zapytanie nie kończy się niepowodzeniem, ponieważ pomimo tego, że jest słowem kluczowym i ma niebieski kolor w SSMS, NOLOCK nie jest słowem zastrzeżonym w Transact-SQL i dlatego nie powoduje błędu składniowego. Lista zastrzeżonych słów: https://msdn.microsoft.com/en-us/library/ms189822.aspx

Prawidłowa składnia do użycia jako podpowiedź:

  • (NOLOCK) jest poprawny, ale nieaktualny.
  • WITH (NOLOCK) jest zalecaną składnią.
Gareth Lyons
źródło
14
Wow, nie jestem pewien, jak tego nie rozgryzłem. To naprawdę doprowadzało mnie do szaleństwa, teraz po prostu czuję się zawstydzona :) Czasami to chyba najprostsze rzeczy.
Brian
2
@Brian Nie martw się, ostatnio musiałem debugować coś bardzo podobnego, w przeciwnym razie może nie być tak łatwo go znaleźć! Możesz zobaczyć, dlaczego stwardnienie rozsiane wycofało tę składnię.
Gareth Lyons,
Czy NOLOCK nie jest zastrzeżonym słowem kluczowym? Czy nie powinno narzekać, jeśli nie używasz [NOLOCK]?
Aaroninus
6
Nie. Msdn.microsoft.com/en-us/library/ms189822.aspx Chociaż w SSMS pojawia się na niebiesko, co może cię zrzucić.
Gareth Lyons,
Niezły chwyt, LOL. Moje ulubione Q / A dzisiaj.
RBarryYoung