Estaba investigando algunos bloqueos cuando vi una consulta que se parecía a esto:
SELECT SomeField FROM SomeTable NOLOCK
Vi el NOLOCK
y tenía curiosidad de cómo podría estar bloqueando otras consultas, en este caso, DELETE
declaraciones. Eché un vistazo rápido a las cerraduras sp_lock
y aquí está lo que vi:
DB S GRANT
TAB IS GRANT
PAG S GRANT
Ahora, entiendo que NOLOCK
se 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.
SELECT SomeField FROM SomeTable NOLOCK (NOLOCK)
para doble efecto nolock;)