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.
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.