it-swarm.com.de

syntax für Nolock in SQL

Ich habe SQL-Anweisungen gesehen, die nolock und mit (nolock) verwendet haben. 

select * from table1 nolock where column1 > 10

UND

select * from table1 with(nolock) where column1 > 10

Welche der obigen Aussagen ist richtig und warum? 

18
seenasan

Die erste Anweisung sperrt nichts, die zweite dagegen. Als ich das gerade auf SQL Server 2005 ausprobiert habe, in

select * from table1 nolock where column1 > 10 --INCORRECT

"nolock" wurde innerhalb dieser Abfrage zum Alias ​​von table1.

select * from table1 with(nolock) where column1 > 10

führt die gewünschte Nolock-Funktionalität aus. Skeptisch? In einem separaten Fenster ausführen

BEGIN TRANSACTION
UPDATE tabl1
 set SomeColumn = 'x' + SomeColumn

um die Tabelle zu sperren, und versuchen Sie es dann mit jeder Sperranweisung in einem eigenen Fenster. Der erste hängt und wartet auf die Freigabe der Sperre. Der zweite wird sofort ausgeführt (und zeigt die "fehlerhaften Daten"). Vergiss nicht herauszugeben

ROLLBACK

wenn du fertig bist.

29
Philip Kelley

Die Liste der veralteten Funktionen finden Sie unter Veraltete Funktionen des Datenbankmoduls in SQL Server 2008 :

  • Angabe von NOLOCK oder READUNCOMMITTED in der FROM-Klausel eines UPDATE oder DELETE-Anweisung 
  • Tabelle angeben Hinweise ohne das Schlüsselwort WITH. 
  • HOLDLOCK-Tabellenhinweis ohne Klammer
  • Verwenden Sie ein Leerzeichen als Trennzeichen zwischen Tabellenhinweisen.
  • Die indirekte Anwendung von Tabellenhinweisen auf den Aufruf einer Tabellenwertfunktion mit mehreren Anweisungen (TVF) über eine Sicht.

Sie befinden sich alle in der Liste der Features, die manchmal nach der nächsten Version von SQL entfernt werden. Das bedeutet, dass sie in der enxt-Version wahrscheinlich nur mit einem niedrigeren Datenbankkompatibilitätsgrad unterstützt werden.

Davon abgesehen sind meine 2c zu diesem Thema so:

  • Sowohl from table nolock als auch from table with(nolock) sind falsch. Wenn Sie Dirty Reads benötigen, sollten Sie die entsprechenden Transaction Isolation Levels verwenden: set transaction isolation level read uncommitted. Auf diese Weise wird der verwendete Islationspegel explizit angegeben und von einem "Drehknopf" gesteuert, anstatt durch die Quelle gespreizt zu werden und allen Macken von Tabellenhinweisen zu unterliegen (indirekte Anwendung durch Ansichten und TVFs usw.).
  • Dirty Reads sind eine Verneinung. Was in 99,99% der Fälle benötigt wird, ist die Reduzierung von Konflikten, nicht das Lesen von nicht festgeschriebenen Daten. Die Konflikte werden reduziert, indem korrekte Abfragen gegen ein gut entworfenes Schema geschrieben werden und erforderlichenfalls die Snapshot-Isolation bereitgestellt wird. Die beste Lösung, die fast immer ein paar extreme Fälle löst, besteht darin, das Lesen des festgeschriebenen Snapshots in der Datenbank zu aktivieren und die Engine ihren Zauber wirken zu lassen: 

    ALTER DATABASE MyDatabase SET ALLOW_SNAPSHOT_ISOLATION ON
    ALTER DATABASE MyDatabase SET READ_COMMITTED_SNAPSHOT ON

Entfernen Sie dann ALLE Hinweise aus den Auswahllisten.

18
Remus Rusanu

Sie sind beide technisch korrekt, jedoch wurde das WITH-Schlüsselwort nicht verwendet, ist veraltet ab SQL 2005, also gewöhnen Sie sich an das WITH-Schlüsselwort - kurze Antwort, verwenden Sie das WITH-Schlüsselwort.

6
boydc7

Verwenden Sie "WITH (NOLOCK)".

5
Rob Garrison

Beide sind syntaktisch korrekt. 

NOLOCK wird zum Alias ​​für table1.

WITH (NOLOCK) wird häufig als eine magische Methode zum Beschleunigen von Datenbanklesevorgängen ausgenutzt, aber ich versuche, es möglichst zu vermeiden.

Die Ergebnismenge kann Zeilen enthalten, die noch nicht festgeschrieben wurden und oft später rückgängig gemacht werden.

Ein Fehler oder eine Ergebnismenge kann leer sein, Zeilen fehlen oder dieselbe Zeile mehrmals anzeigen.

Dies liegt daran, dass andere Transaktionen Daten gleichzeitig verschieben, wenn Sie sie lesen.

READ COMMITTED fügt ein zusätzliches Problem hinzu, bei dem Daten in einer einzelnen Spalte beschädigt werden, wenn mehrere Benutzer dieselbe Zelle gleichzeitig ändern.

Es gibt auch andere Nebenwirkungen, die dazu führen, dass die Geschwindigkeitssteigerung, die Sie eigentlich erhofft hatten, beeinträchtigt wird.

Nun, wissen Sie, verwenden Sie es nie wieder.

0