Eu estava investigando alguns bloqueios quando vi uma consulta parecida com esta:
SELECT SomeField FROM SomeTable NOLOCK
Eu vi o NOLOCK
e fiquei curioso como poderia estar bloqueando outras consultas, neste caso DELETE
. Dei uma olhada rápida nas fechaduras usando sp_lock
e aqui está o que eu vi:
DB S GRANT
TAB IS GRANT
PAG S GRANT
Agora, meu entendimento é que NOLOCK
é suposto usar apenas um bloqueio de Schema-Stability, por que ele estava pegando um bloqueio de IS?
Minha curiosidade foi despertada. Eu olhei no BOL e vi que havia duas maneiras de usá-lo, WITH (NOLOCK)
e o descontinuado (NOLOCK)
, então decidi experimentá-los. Executei as seguintes consultas, seguidas da execução 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
Com certeza, existem meus bloqueios de estabilidade de esquema. Então, minha pergunta é a seguinte: o que está acontecendo aqui? Se a sintaxe aceita para o uso do NOLOCK é WITH (NOLOCK)
ou (NOLOCK)
, por que a consulta não ocorre quando é executada apenas com simplicidade NOLOCK
(sem os parênteses)? Se for suportado, por que pegar um bloqueio de IS? O que estou perdendo aqui? Estive pesquisando on-line por uma resposta, mas até agora não foram atendidas.
Eu testei isso em 2008R2 e 2012.
SELECT SomeField FROM SomeTable NOLOCK (NOLOCK)
para efeito nolock duplo;)