Eu estava investigando alguns bloqueios quando vi uma consulta parecida com esta:
SELECT SomeField FROM SomeTable NOLOCK
Eu vi o NOLOCKe fiquei curioso como poderia estar bloqueando outras consultas, neste caso DELETE. Dei uma olhada rápida nas fechaduras usando sp_locke 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;)