Ich habe einige Blockierungen untersucht, als ich eine Abfrage sah, die ungefähr so aussah:
SELECT SomeField FROM SomeTable NOLOCK
Ich habe das gesehen NOLOCK
und war gespannt, wie es andere Abfragen blockieren kann, in diesem Fall DELETE
Aussagen. Ich habe einen kurzen Blick auf die Schlösser geworfen sp_lock
und hier ist, was ich gesehen habe:
DB S GRANT
TAB IS GRANT
PAG S GRANT
Nach meinem Verständnis NOLOCK
sollte nur eine Schema-Stabilitätssperre verwendet werden. Warum hat sie dann eine IS-Sperre ergriffen?
Meine Neugier war geweckt. Ich habe in BOL nachgesehen und festgestellt, dass es zwei Möglichkeiten gibt, es zu verwenden, WITH (NOLOCK)
und die veralteten (NOLOCK)
, also habe ich beschlossen, es mit diesen zu versuchen. Ich habe die folgenden Abfragen ausgeführt und anschließend ausgeführt 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
Sicher genug, es gibt meine Schemastabilitätssperren. Meine Frage lautet also: Was ist hier los? Wenn die akzeptierte Syntax für die Verwendung von NOLOCK entweder WITH (NOLOCK)
oder ist (NOLOCK)
, warum tritt dann kein Abfragefehler auf, wenn die Abfrage nur in NOLOCK
Klammern ausgeführt wird? Wenn es unterstützt wird, warum greift es nach einer IS-Sperre? Was vermisse ich hier? Ich habe online nach einer Antwort gesucht, bin aber bisher zu kurz gekommen.
Ich habe dies sowohl auf 2008R2 als auch auf 2012 getestet.
SELECT SomeField FROM SomeTable NOLOCK (NOLOCK)
für doppelter nolock effekt;)