(NOLOCK) vs NOLOCK


24

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

SELECT SomeField FROM SomeTable NOLOCK

J'ai vu le NOLOCKet j'étais curieux de voir comment cela pouvait bloquer d'autres requêtes, dans ce cas, les DELETEdéclarations. J'ai jeté un rapide coup d'œil aux serrures à l'aide sp_locket voici ce que j'ai vu:

DB      S   GRANT

TAB     IS  GRANT

PAG    S    GRANT

Maintenant, si je comprends bien, il NOLOCKest supposé ne prendre qu'un verrou de stabilité de schéma, pourquoi a-t-il ensuite 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 la dépréciée (NOLOCK), alors j'ai décidé de les essayer. J'ai exécuté les requêtes suivantes, suivies de l'exécution 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

Effectivement, il y a mes verrous de stabilité de schéma. Ma question est donc la suivante: que se passe-t-il ici? Si la syntaxe acceptée pour l'utilisation de NOLOCK est soit WITH (NOLOCK)ou (NOLOCK), alors pourquoi l'erreur de requête ne s'exécute-t-elle pas lorsqu'elle s'exécute simplement NOLOCK(sans les parenthèses)? S'il est pris en charge, pourquoi attraper un verrou IS? Qu'est-ce que j'oublie 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.


4
SELECT SomeField FROM SomeTable NOLOCK (NOLOCK)pour double effet nolock;)
ypercubeᵀᴹ

Réponses:


52
SELECT SomeField
FROM   SomeTable NOLOCK 

signifie que vous venez de créer un 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, bien qu'étant un mot clé et affichant du bleu dans SSMS, NOLOCK n'est pas un mot réservé dans Transact-SQL et ne provoque donc pas d'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.

14
Wow, je ne sais pas comment je n'ai pas compris ça. Ça me rendait vraiment fou, maintenant je me sens juste embarrassé :) C'est parfois les choses les plus simples, je suppose.
Brian

2
@Brian Pas de soucis, j'ai dû déboguer quelque chose de très similaire récemment, sinon cela n'aurait peut-être pas été aussi facile à repérer! Vous pouvez voir pourquoi MS a déconseillé cette syntaxe.
Gareth Lyons

NOLOCK n'est-il pas un mot-clé réservé? Ne devrait-il pas se plaindre si vous n'utilisez pas [NOLOCK]?
Aaroninus

6
Nope msdn.microsoft.com/en-us/library/ms189822.aspx Bien qu'il apparaisse en bleu dans SSMS, ce qui peut vous décourager.
Gareth Lyons

Belle prise, LOL. Mon Q / A préféré aujourd'hui.
RBarryYoung
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.