web-dev-qa-db-fra.com

(NOLOCK) vs NOLOCK

J'étudiais un blocage lorsque j'ai vu une requête qui ressemblait à ceci:

SELECT SomeField FROM SomeTable NOLOCK

J'ai vu le NOLOCK et j'étais curieux de voir comment il pouvait bloquer d'autres requêtes, dans ce cas les instructions DELETE. J'ai jeté un rapide coup d'œil aux serrures en utilisant sp_lock Et voici ce que j'ai vu:

DB      S   GRANT

TAB     IS  GRANT

PAG    S    GRANT

Maintenant, je crois comprendre que NOLOCK est censé prendre uniquement un verrou de stabilité de schéma, pourquoi a-t-il alors saisi un verrou IS?

Ma curiosité était piquée. J'ai regardé dans BOL et j'ai vu qu'il y avait deux façons de l'utiliser, WITH (NOLOCK) et le obsolète (NOLOCK), J'ai donc décidé de les essayer. J'ai exécuté les requêtes suivantes, suivi de l'exécution de sp_lock:

SELECT SomeField FROM SomeTable WITH (NOLOCK)
SUBVENTION DB S 
 
 TAB Sch-S GRANT 
SELECT SomeField FROM SomeTable (NOLOCK)
 SUBVENTION DB S 
 
 SUBVENTION TAB Sch-S 

Effectivement, il y a mes verrous de stabilité de schéma. Alors ma question est la suivante: que se passe-t-il ici? Si la syntaxe acceptée pour l'utilisation de NOLOCK est WITH (NOLOCK) ou (NOLOCK), Alors pourquoi l'erreur de requête ne s'exécute-t-elle pas lorsqu'elle s'exécute avec simplement NOLOCK (sans les parenthèses) ? Si elle est prise en charge, pourquoi attraper un IS verrou? Que me manque-t-il ici? J'ai cherché une réponse en ligne, mais jusqu'à présent je n'ai pas réussi.

J'ai testé cela sur 2008R2 et 2012.

24
Brian
SELECT SomeField
FROM   SomeTable NOLOCK 

signifie que vous venez d'alias SomeTable AS NOLOCK. Essayez ce qui suit pour voir clairement:

SELECT NOLOCK.SomeField
FROM   SomeTable NOLOCK 

Cela n'a évidemment aucun effet sur le comportement de verrouillage de la requête. La requête n'échoue pas car, en dépit d'être un mot-clé et d'afficher du bleu dans SSMS, NOLOCK n'est pas un mot réservé dans Transact-SQL et ne provoque donc pas une erreur de syntaxe. Liste des mots réservés: https://msdn.Microsoft.com/en-us/library/ms189822.aspx

Syntaxe correcte pour l'utilisation comme indice:

  • (NOLOCK) Est valide mais obsolète.
  • WITH (NOLOCK) est la syntaxe recommandée.
52
Gareth Lyons