Badałem pewne blokowanie, gdy zobaczyłem zapytanie, które wyglądało mniej więcej tak:
SELECT SomeField FROM SomeTable NOLOCK
Widziałem NOLOCK
i byłem ciekawy, jak może blokować inne zapytania, w tym przypadku DELETE
oświadczenia. Rzuciłem okiem na zamki sp_lock
i oto, co zobaczyłem:
DB S GRANT
TAB IS GRANT
PAG S GRANT
Rozumiem teraz, że NOLOCK
powinien 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.
źródło
SELECT SomeField FROM SomeTable NOLOCK (NOLOCK)
dla efektu podwójnego nolocka;)Odpowiedzi:
oznacza, że właśnie zostałeś alias
SomeTable AS NOLOCK
. Spróbuj poniżej, aby zobaczyć to wyraźnie: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ą.źródło