Kategorien:

Abfragesyntax

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> ]
Copy

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:

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.

  1. Die folgende Abfrage wird in Transaktion T1 ausgeführt:

    SELECT * FROM T WHERE ID < 20 FOR UPDATE;
    
    Copy

    Die Abfrage gibt die Werte 5 und 10 zurück und sperrt diese beiden Zeilen.

  2. Eine andere Transaktion T2, führt die folgende DELETE-Operation aus:

    DELETE FROM T WHERE ID = 5;
    
    Copy

    Die Transaktion T2 muss warten, bis T1 abgeschlossen ist (d. h. bis Commit oder Rollback ausgeführt wurden).

  3. Eine dritte Transaktion T3 kann jedoch die folgende INSERT-Operation ausführen:

    INSERT INTO T VALUES 12;
    
    Copy
  4. Eine nachfolgende Abfrage in T1 gibt nun drei Werte (Zeilen) zurück, nicht zwei: 5, 10 und 12:

    SELECT * FROM T WHERE ID < 20;
    
    Copy

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;
Copy

Wenden Sie eine maximale Wartezeit von 60 Sekunden für das Sperren der Zeilen an:

BEGIN;
...
SELECT * FROM ht FOR UPDATE WAIT 60;
...
COMMIT;
Copy