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.
SELECT SomeField FROM SomeTable NOLOCK (NOLOCK)
pour double effet nolock;)