(NOLOCK) vs NOLOCK

24

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.

Brian
fonte
4
SELECT SomeField FROM SomeTable NOLOCK (NOLOCK)para efeito nolock duplo;)
ypercubeᵀᴹ

Respostas:

52
SELECT SomeField
FROM   SomeTable NOLOCK 

significa que você acabou de usar o alias SomeTable AS NOLOCK. Experimente o abaixo para ver isso claramente:

SELECT NOLOCK.SomeField
FROM   SomeTable NOLOCK 

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.
Gareth Lyons
fonte
14
Uau, não sei como eu não descobri isso. Isso realmente estava me deixando louco, agora eu só me sinto envergonhada :) Às vezes é a coisa mais simples, eu acho.
Brian
2
@ Brian Não se preocupe, tive que depurar algo muito semelhante recentemente, caso contrário, pode não ter sido tão fácil de detectar! Você pode ver por que a MS reprovou essa sintaxe.
precisa saber é o seguinte
NOLOCK não é uma palavra-chave reservada? Não deveria reclamar se você não usar [NOLOCK]?
Aaroninus 30/01
6
Não, msdn.microsoft.com/en-us/library/ms189822.aspx Embora apareça em azul no SSMS, o que pode prejudicá -lo.
Gareth Lyons
Boa captura, LOL. Meu Q / A favorito hoje.
precisa saber é o seguinte