2017-11-08 1 views
0

Ich weiß, dass NOLOCK ist Standard für SELECT-Operationen. Wenn ich also nicht einmal das Schlüsselwort with (NOLOCK) für eine Select-Abfrage schreibe, wird die Zeile nicht gesperrt.Welche Art von Sperrmodus für INSERT-, UPDATE- oder DELETE-Vorgänge in SQL Server?

Ich konnte nicht finden, was passiert, wenn with (ROWLOCK) nicht für die Abfrage UPDATE und DELETE angegeben ist. Gibt es einen Unterschied zwischen den folgenden Abfragen?

UPDATE MYTABLE set COLUMNA = 'valueA'; 

und

UPDATE MYTABLE WITH (ROWLOCK) set COLUMNA = 'valueA'; 
+0

Warum haben Sie den Eindruck, dass 'NOLOCK' die Standardeinstellung ist? –

+0

@MartinSmith Dies wird in [link] (https://technet.microsoft.com/en-us/library/ms172398 (v = sql.110) .aspx) als 'Dies ist der Standard für SELECT-Operationen. ' – Tunahan

+1

Das ist keine Dokumentation über das markierte Produkt. "Das Verwenden von Sperrhinweisen in SQL Server Compact 4.0 ähnelt dem von SQL Server. ** Für SQL Server Compact 4.0 weist der NOLOCK-Hinweis jedoch ein völlig anderes Verhalten auf als für SQL Server **. In SQL Server Compact 4.0 Der NOLOCK-Hinweis ist der Standard für SELECT-Anweisungen, erzwingt jedoch weiterhin Read Committed-Verhalten. " –

Antwort

0

Wenn es keinen Hinweis ist, dann wird der DB-Engine die LOCK MDOE in Abhängigkeit von der Operation wählt (select/ändern), den Grad der Isolation und Granularität und Möglichkeit, das Granularitätsniveau zu eskalieren. Das Angeben von ROWLOCKX ergibt nicht 100% des Ergebnisses der Tatsache, dass es X in Reihen ist. Im Allgemeinen ein sehr großes Thema für eine solche breite Ausgabe

zuerst über Sperrmodi lesen, dass https://technet.microsoft.com/en-us/library/ms175519(v=sql.105).aspx Wenn

+0

Es wird viele Dinge über Lock-Modi für mich zu lernen geben. Danke für den Link und die Erklärung. – Tunahan

0

Also, wenn ich auch mit (NOLOCK) Schlüsselwort für eine Auswahlabfrage nicht schreiben, Die Zeile wird nicht gesperrt.

Auswahlabfragen nehmen immer eine Sperre, und es wird gemeinsame Sperre und Dauer der Sperre hängt von Ihrer Isolationsstufe

Gibt es einen Unterschied zwischen unten Abfragen bezeichnet?

UPDATE MYTABLE set COLUMNA = 'valueA';
und
UPDATE MYTABLE MIT (ROWLOCK) set COLUMNA = 'valueA';

Angenommen, Ihre erste Aussage mehr als 5000 Schlösser wirkt, werden Sperren zu Tabellen eskaliert werden, aber mit Dolle ... SQLServer verriegelt nicht insgesamt Tabelle

+0

1. Nicht 5000 Reihen, aber 5000 Schlösser. 2. Wenn Eskalation erlaubt ist –

+0

Vielen Dank für den Hinweis, verpasst es. – TheGameiswar

0

In Anweisung 1 (ohne Dolle) das DBMS entscheidet um die gesamte Tabelle oder die Seite, auf der sich der Aktualisierungsdatensatz befindet, zu sperren. Das bedeutet, dass beim Aktualisieren der Zeile alle oder andere Zeilen in der Tabelle gesperrt sind und nicht aktualisiert oder gelöscht werden können.

Anweisung 2 (mit (ROWLOCK)) schlägt vor, dass das DBMS nur den Datensatz sperrt, der gerade aktualisiert wird. Aber sei dir bewusst, dass dies nur ein TIPP ist und es keine Garantie gibt, dass das vom DBMS akzeptiert wird.

Verwandte Themen