(NOLOCK) vs NOLOCK


24

Stavo indagando su alcuni blocchi quando ho visto una query simile a questa:

SELECT SomeField FROM SomeTable NOLOCK

Ho visto NOLOCKed ero curioso di sapere come avrebbe potuto bloccare altre query, in questo caso DELETEdichiarazioni. Ho dato una rapida occhiata alle serrature usando sp_locked ecco cosa ho visto:

DB      S   GRANT

TAB     IS  GRANT

PAG    S    GRANT

Ora, la mia comprensione è che NOLOCKsi 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.


4
SELECT SomeField FROM SomeTable NOLOCK (NOLOCK)per doppio effetto nolock;)
ypercubeᵀᴹ

Risposte:


52
SELECT SomeField
FROM   SomeTable NOLOCK 

significa che hai appena fatto le alias SomeTable AS NOLOCK. Prova quanto segue per vederlo chiaramente:

SELECT NOLOCK.SomeField
FROM   SomeTable NOLOCK 

Ciò ovviamente non ha alcun effetto sul comportamento di blocco della query. La query non fallisce perché nonostante sia una parola chiave e mostri blu in SSMS, NOLOCK non è una parola riservata in Transact-SQL e quindi non causa un errore di sintassi. Elenco di parole riservate: https://msdn.microsoft.com/en-us/library/ms189822.aspx

Sintassi corretta per l'utilizzo come suggerimento:

  • (NOLOCK) è valido ma obsoleto.
  • WITH (NOLOCK) è la sintassi consigliata.

14
Wow, non sono sicuro di come non l'ho capito. Mi stava davvero facendo impazzire, ora mi sento solo imbarazzato :) A volte sono le cose più semplici, immagino.
Brian

2
@Brian Nessun problema, ho dovuto eseguire il debug di qualcosa di molto simile di recente, altrimenti potrebbe non essere stato così facile da individuare! Puoi capire perché MS ha deprecato quella sintassi.
Gareth Lyons,

NOLOCK non è una parola chiave riservata? Non dovrebbe lamentarsi se non usi [NOLOCK]?
Aaronino

6
No msdn.microsoft.com/en-us/library/ms189822.aspx Anche se appare in blu in SSMS che può buttarti via.
Gareth Lyons,

Bella cattura, LOL. Il mio Q / A preferito oggi.
RBarryYoung,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.