Stavo indagando su alcuni blocchi quando ho visto una query simile a questa:
SELECT SomeField FROM SomeTable NOLOCK
Ho visto NOLOCK
ed ero curioso di sapere come avrebbe potuto bloccare altre query, in questo caso DELETE
dichiarazioni. Ho dato una rapida occhiata alle serrature usando sp_lock
ed ecco cosa ho visto:
DB S GRANT
TAB IS GRANT
PAG S GRANT
Ora, la mia comprensione è che NOLOCK
si suppone che prenda solo un blocco Schema-Stability, perché è stato quindi afferrare un blocco IS?
La mia curiosità è stata suscitata. Ho guardato BOL e ho visto che c'erano due modi per usarlo WITH (NOLOCK)
e quello deprecato (NOLOCK)
, quindi ho deciso di provarlo. Ho eseguito le seguenti query seguite da running sp_lock
:
SELECT SomeField FROM SomeTable WITH (NOLOCK)
DB S GRANT SCHEDA SCH-S CONCESSIONE
SELECT SomeField FROM SomeTable (NOLOCK)
DB S GRANT SCHEDA SCH-S CONCESSIONE
Abbastanza sicuro, ci sono i miei blocchi di stabilità dello schema. Quindi la mia domanda è questa: cosa sta succedendo qui? Se la sintassi accettata per l'utilizzo di NOLOCK è o WITH (NOLOCK)
o (NOLOCK)
, allora perché la query non si interrompe quando viene eseguita semplicemente NOLOCK
(senza parentesi)? Se è supportato, perché afferrare un blocco IS? Cosa mi sto perdendo qui? Ho cercato online una risposta, ma finora sono venuti meno.
Ho provato questo sia su 2008R2 che su 2012.
SELECT SomeField FROM SomeTable NOLOCK (NOLOCK)
per doppio effetto nolock;)