Я исследовал некоторые блокировки, когда увидел запрос, который выглядел примерно так:
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 TAB Sch-S GRANT
SELECT SomeField FROM SomeTable (NOLOCK)
DB S GRANT TAB Sch-S GRANT
Конечно же, есть мои блокировки схемы устойчивости. Итак, мой вопрос заключается в следующем: что здесь происходит? Если принятый синтаксис для использования NOLOCK - либо, WITH (NOLOCK)либо (NOLOCK), то почему запрос не выдаст ошибку, если он выполняется просто NOLOCK(без скобок)? Если это поддерживается, зачем захватывать блокировку IS? Что мне здесь не хватает? Я искал в Интернете ответ, но пока что не дотянул.
Я проверил это на 2008R2 и 2012.
SELECT SomeField FROM SomeTable NOLOCK (NOLOCK)для двойного эффекта nolock;)