(NOLOCK) vs NOLOCK

24

Estaba investigando algunos bloqueos cuando vi una consulta que se parecía a esto:

SELECT SomeField FROM SomeTable NOLOCK

Vi el NOLOCKy tenía curiosidad de cómo podría estar bloqueando otras consultas, en este caso, DELETEdeclaraciones. Eché un vistazo rápido a las cerraduras sp_locky aquí está lo que vi:

DB      S   GRANT

TAB     IS  GRANT

PAG    S    GRANT

Ahora, entiendo que NOLOCKse supone que solo debe tomar un bloqueo de estabilidad de esquema, ¿por qué estaba agarrando un bloqueo IS?

Mi curiosidad se despertó. Miré en BOL y vi que había dos formas de usarlo, WITH (NOLOCK)y en desuso (NOLOCK), así que decidí intentarlo. Ejecuté las siguientes consultas seguidas de ejecutar 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

Efectivamente, hay mis bloqueos de estabilidad de esquema. Entonces mi pregunta es esta: ¿qué está pasando aquí? Si la sintaxis aceptada para usar NOLOCK es WITH (NOLOCK)o (NOLOCK), ¿por qué la consulta no se produce un error cuando se ejecuta simplemente NOLOCK(sin los paréntesis)? Si es compatible, ¿por qué tomar un bloqueo IS? ¿Que me estoy perdiendo aqui? He estado buscando una respuesta en línea, pero hasta ahora me he quedado corto.

He probado esto en 2008R2 y 2012.

Brian
fuente
44
SELECT SomeField FROM SomeTable NOLOCK (NOLOCK)para doble efecto nolock;)
ypercubeᵀᴹ

Respuestas:

52
SELECT SomeField
FROM   SomeTable NOLOCK 

significa que acabas de alias SomeTable AS NOLOCK. Pruebe lo siguiente para ver esto claramente:

SELECT NOLOCK.SomeField
FROM   SomeTable NOLOCK 

Obviamente, esto no tiene ningún efecto sobre el comportamiento de bloqueo de la consulta. La consulta no falla porque, a pesar de ser una palabra clave y mostrar azul en SSMS, NOLOCK no es una palabra reservada en Transact-SQL y, por lo tanto, no causa un error de sintaxis. Lista de palabras reservadas: https://msdn.microsoft.com/en-us/library/ms189822.aspx

Sintaxis correcta para usar como pista:

  • (NOLOCK) es válido pero obsoleto
  • WITH (NOLOCK) es la sintaxis recomendada
Gareth Lyons
fuente
14
Wow, no estoy seguro de cómo no me di cuenta de eso. Realmente me estaba volviendo loco, ahora me siento avergonzado :) Supongo que a veces son las cosas más simples.
Brian
2
@Brian No te preocupes, tuve que depurar algo muy similar recientemente, de lo contrario, puede que no haya sido tan fácil de detectar. Puede ver por qué MS ha desaprobado esa sintaxis.
Gareth Lyons el
¿NOLOCK no es una palabra clave reservada? ¿No debería quejarse si no usa [NOLOCK]?
Aaroninus
66
No msdn.microsoft.com/en-us/library/ms189822.aspx Aunque aparece en azul en SSMS, lo que puede desanimarlo.
Gareth Lyons
Buena captura, jaja. Mi Q / A favorito hoy.
RBarryYoung