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.
SELECT SomeField FROM SomeTable NOLOCK (NOLOCK)
dla efektu podwójnego nolocka;)