(NOLOCK) gegen NOLOCK


24

Ich habe einige Blockierungen untersucht, als ich eine Abfrage sah, die ungefähr so ​​aussah:

SELECT SomeField FROM SomeTable NOLOCK

Ich habe das gesehen NOLOCKund war gespannt, wie es andere Abfragen blockieren kann, in diesem Fall DELETEAussagen. Ich habe einen kurzen Blick auf die Schlösser geworfen sp_lockund hier ist, was ich gesehen habe:

DB      S   GRANT

TAB     IS  GRANT

PAG    S    GRANT

Nach meinem Verständnis NOLOCKsollte 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 NOLOCKKlammern 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.


4
SELECT SomeField FROM SomeTable NOLOCK (NOLOCK)für doppelter nolock effekt;)
ypercubeᵀᴹ 30.01.17

Antworten:


52
SELECT SomeField
FROM   SomeTable NOLOCK 

bedeutet, Sie haben gerade befangen SomeTable AS NOLOCK. Versuchen Sie das Folgende, um dies klar zu sehen:

SELECT NOLOCK.SomeField
FROM   SomeTable NOLOCK 

Dies hat offensichtlich keine Auswirkungen auf das Sperrverhalten der Abfrage. Die Abfrage schlägt nicht fehl, da NOLOCK, obwohl es ein Schlüsselwort ist und in SSMS blau angezeigt wird, in Transact-SQL kein reserviertes Wort ist und daher keinen Syntaxfehler verursacht. Liste der reservierten Wörter: https://msdn.microsoft.com/en-us/library/ms189822.aspx

Richtige Syntax für die Verwendung als Hinweis:

  • (NOLOCK) ist gültig aber veraltet.
  • WITH (NOLOCK) ist die empfohlene Syntax.

14
Wow, ich bin mir nicht sicher, wie ich das herausgefunden habe. Es hat mich wirklich verrückt gemacht, jetzt ist es mir einfach peinlich :) Es sind manchmal die einfachsten Dinge, denke ich.
Brian

2
@Brian Keine Sorge, ich musste in letzter Zeit etwas sehr ähnliches debuggen, sonst war es vielleicht nicht so einfach zu erkennen! Sie können sehen, warum MS diese Syntax nicht mehr unterstützt.
Gareth Lyons

Ist NOLOCK kein reserviertes Schlüsselwort? Sollte es sich nicht beschweren, wenn Sie [NOLOCK] nicht verwenden?
Aaroninus

6
Nein msdn.microsoft.com/en-us/library/ms189822.aspx Obwohl es in SSMS blau angezeigt wird, kann es Sie abschrecken.
Gareth Lyons

Netter Fang, LOL. Mein Lieblings-Q / A heute.
RBarryYoung
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.