HOLDLOCK mit UPDLOCK

8

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

Aktualisierung:

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.

    
user1967701 10.01.2013, 18:16
quelle

3 Antworten

11

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

an
  

Wenn 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."

    
Martin Smith 10.01.2013 18:20
quelle
4

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 ...

%Vor%

Wenn Sie jedoch einen gruppierten Index zu Ihrer Tabelle hinzufügen, verschwindet die exklusive Tabellensperre und wird durch RangeS-U lock ... ersetzt.

%Vor%

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 ...

    
Michael Fredrickson 10.01.2013 18:49
quelle
1

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.

    
Sebastian Meine 10.01.2013 18:51
quelle

Tags und Links