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 cela pouvait bloquer d'autres requêtes, dans ce cas, les DELETE
déclarations. J'ai jeté un rapide coup d'œil aux serrures à l'aide sp_lock
et voici ce que j'ai vu:
DB S GRANT
TAB IS GRANT
PAG S GRANT
Maintenant, si je comprends bien, il NOLOCK
est 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.
la source
SELECT SomeField FROM SomeTable NOLOCK (NOLOCK)
pour double effet nolock;)Réponses:
signifie que vous venez de créer un alias
SomeTable AS NOLOCK
. Essayez ce qui suit pour voir clairement: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.la source