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.
fonte
SELECT SomeField FROM SomeTable NOLOCK (NOLOCK)
para efeito nolock duplo;)Respostas:
significa que você acabou de usar o alias
SomeTable AS NOLOCK
. Experimente o abaixo para ver isso claramente:Obviamente, isso não afeta o comportamento de bloqueio da consulta. A consulta não falha porque, apesar de ser uma palavra-chave e mostrar azul no SSMS, NOLOCK não é uma palavra reservada no Transact-SQL e, portanto, não causa um erro de sintaxe. Lista de palavras reservadas: https://msdn.microsoft.com/en-us/library/ms189822.aspx
Sintaxe correta para usar como dica:
(NOLOCK)
é válido, mas reprovado.WITH (NOLOCK)
é a sintaxe recomendada.fonte