- Kategorien:
FOR UPDATE¶
Sperrt die Zeilen, die die Abfrage auswählt, so lange, bis die Transaktion, die die Abfrage enthält, committet oder abgebrochen wird.
Diese Klausel wird nur für die Verwendung mit Hybridtabellen unterstützt und ist nützlich für transaktionale Workloads, bei denen mehrere Transaktionen gleichzeitig versuchen, auf dieselben Zeilen zuzugreifen. Zeilen sind für Aktualisierungen gesperrt, sodass andere Transaktionen keine Daten in diese Zeilen schreiben können. Die Sperre dauert so lange, bis für die Transaktion, die die Sperre vornimmt, ein vollständiges Commit oder Rollback ausgeführt wurde. Andere Transaktionen können jedoch die gesperrten Zeilen lesen, und andere Zeilen in derselben Tabelle können gelesen, aktualisiert oder gelöscht werden.
SELECT ...
FROM ...
[ ... ]
FOR UPDATE [ NOWAIT | WAIT <wait_time> ]
Parameter¶
NOWAIT
Gibt einen Fehler zurück, wenn die Transaktion die ausgewählten Zeilen nicht sofort sperren kann. NOWAIT ist der Standard.
WAIT wait_time
Gibt die maximale Zeit (in Sekunden) an, die die Abfrage wartet, um Sperren auf Zeilenebene zu erhalten. Wenn die Wartezeit abgelaufen ist, gibt die Abfrage einen Fehler zurück.
Einschränkungen¶
FOR UPDATE-Klausel:
Kann nicht mit AUTOCOMMIT-Transaktionen verwendet werden.
Muss die letzte Klausel in der SELECT-Anweisung sein.
Kann nicht in einer CTAS-Anweisung verwendet werden.
Kann nicht innerhalb von Unterabfragen verwendet werden.
Eine Auswahl aus mehreren Tabellen (Joins) oder Set-Operationen sind nicht möglich.
Kann nicht verwendet werden, wenn die Abfrage Folgendes enthält:
Nutzungshinweise¶
Da Hybridtabellen die Isolationsebene READ COMMITTED unterstützen, garantieren FOR UPDATE-Klauseln keine Lesestabilität. Angenommen, eine Tabelle T
mit einer einzelnen Spalte ID
enthält zwei Zeilen mit den Werten 5
und 10
.
Die folgende Abfrage wird in Transaktion
T1
ausgeführt:SELECT * FROM T WHERE ID < 20 FOR UPDATE;
Die Abfrage gibt die Werte
5
und10
zurück und sperrt diese beiden Zeilen.Eine andere Transaktion
T2
, führt die folgende DELETE-Operation aus:DELETE FROM T WHERE ID = 5;
Die Transaktion
T2
muss warten, bisT1
abgeschlossen ist (d. h. bis Commit oder Rollback ausgeführt wurden).Eine dritte Transaktion
T3
kann jedoch die folgende INSERT-Operation ausführen:INSERT INTO T VALUES 12;
Eine nachfolgende Abfrage in
T1
gibt nun drei Werte (Zeilen) zurück, nicht zwei:5
,10
und12
:SELECT * FROM T WHERE ID < 20;
Beispiele¶
Eröffnen Sie eine neue Transaktion, wählen Sie alle Zeilen einer Hybridtabelle (ht
) aus, und sperren Sie diese Zeilen, bis die Transaktion committet ist. Aktualisieren Sie einige ausgewählte Zeilen, und führen Sie eine weitere Abfrage vor dem Commit der Transaktion aus.
BEGIN;
...
SELECT * FROM ht ORDER BY c1 FOR UPDATE;
...
UPDATE ht set c1 = c1 + 10 WHERE c1 = 0;
...
SELECT ... ;
...
COMMIT;
Wenden Sie eine maximale Wartezeit von 60 Sekunden für das Sperren der Zeilen an:
BEGIN;
...
SELECT * FROM ht FOR UPDATE WAIT 60;
...
COMMIT;