Es erscheint entweder mit HOLDLOCK
oder UPDLOCK
in einer Transaktion (sagen wir T1), blockiert nicht den Lesezugriff von einer anderen Transaktion (sagen wir T2).
Nach meinem Verständnis wird HOLDLOCK
bis zum Abschluss von T1 Aktualisierungen / Löschungen um T2 verhindern; und ein UPDLOCK
verhindert Aktualisierungen / Löschungen / Einfügungen durch T2. In beiden Fällen hat T2 Lesezugriff auf diese Datensätze.
Aber mit beiden (wie: HOLDLOCK, UPDLOCK
) blockiert T2 sogar von einem Lesezugriff. Was genau passiert, wenn wir beide benutzen?
Danke für Ihre Einsicht
Das sehe ich aber nicht:
Zum Beispiel:
In Abfrage 1:
%Vor%In Abfrage 2:
%Vor%Abfrage 2 liefert keine Ergebnisse, bis Abfrage 1 beendet ist.
UPDLOCK
wirkt sich auf die Art der Sperre aus. Es bedeutet für eine SELECT
-Anweisung, dass U
locks genommen wird und nicht S
lock. Bei Standard Read Committed Level werden sie freigegeben, sobald die Daten gelesen werden.
Das obige gilt für Zeilen- und Seitensperren. Für Sperren auf Tabellenebene gibt BOL-Status
anWenn UPDLOCK mit TABLOCK kombiniert wird oder eine Sperre auf Tabellenebene ausgeführt wird Aus einem anderen Grund wird stattdessen eine exklusive Sperre (X) verwendet.
HOLDLOCK
bedeutet, dass Sie serialisierbare Isolationssemantiken erhalten, so dass die Sperren nicht bestehen bis zum Ende der Transaktion freigegeben und mindestens die gesamte Reichweite Ihrer Anfrage gesperrt wird, um das Einfügen von Phantomen zu verhindern.
A U
lock ist kompatibel mit anderen S
-Sperren, aber nicht mit anderen U
-Sperren (Siehe Kompatibilitätsmatrix sperren ), wenn die Sperren auf Zeilen- oder Seitenebene aufgehoben wurden, werden andere Leser nicht blockiert, es sei denn, sie verwenden auch den UPDLOCK
Hinweis.
Wenn ein Objektlevel X
lock aufgrund von UPDLOCK
entfernt wird, dann werden Leser blockiert, wenn sie versuchen, eine IS
Sperre für die Tabelle zu erhalten. In der Beispielabfrage versuchen Sie, sys.dm_tran_locks
zu betrachten, während die zweite Abfrage blockiert ist, um zu sehen, auf welche Sperren beide Transaktionen warten.
Für die Abfrage in Ihrer Frage
%Vor% Sie erhalten immer eine X
-Sperre für das Objekt, wenn der Abfrageplan einen Scan auf einem Heap anzeigt. Wenn es sich um einen Indexscan handelt, hängt dies von der verwendeten Sperrgranularität ab (Sperreskalation auf Tabellenebene wird im Allgemeinen nach mindestens 5.000 Sperren der unteren Ebene werden genommen."
Ich glaube, Martin hat bereits erklärt, wie die updlock
zu einer exklusiven Sperre (+1) führen kann ... und ich würde das lieber als Kommentar / Frage veröffentlichen, aber mein Kommentar ist zu groß ...
Hier ist ein kurzes Beispiel für das updlock
, das zu x
lock führt ...
Wenn Sie jedoch einen gruppierten Index zu Ihrer Tabelle hinzufügen, verschwindet die exklusive Tabellensperre und wird durch RangeS-U
lock ... ersetzt.
Sie haben also im Grunde einen Clustered-Index für diese Tabelle?
BEARBEITEN:
Ein weiteres Beispiel, das einen nicht gruppierten Index verwendet ...
%Vor% führt zu RangeS-S
lock ...
Aber ...
%Vor%führt zu einer exklusiven Tabellensperre ...
Die serialisierbare Isolation bewirkt, dass eine Tabellensperre ausgelöst wird, wenn die Tabelle keinen geeigneten Index für die Abfrage aufweist. HOLDLOCK bewirkt, dass serializable die effektive Transaktionsisolationsstufe für die Tabelle ist, auf der sie erwähnt wird.
Dies zusammen mit der Eskalation zu X
, die andere erwähnt haben, verursacht das angezeigte Verhalten.
Tags und Links sql-server