Zum Inhalt springen

Transaktionsverwaltung

DuckDB unterstützt ACID-Datenbanktransaktionen. Transaktionen bieten Isolation, d. h. Änderungen einer Transaktion sind für nebenläufige Transaktionen erst nach dem Commit sichtbar. Eine Transaktion kann auch abgebrochen werden, wodurch alle bisher vorgenommenen Änderungen verworfen werden.

Anweisungen

DuckDB stellt die folgenden Anweisungen zur Transaktionsverwaltung bereit.

Eine Transaktion starten

Um eine Transaktion zu starten, führen Sie aus:

BEGIN TRANSACTION;

Eine Transaktion committen

Sie können eine Transaktion committen, um sie für andere Transaktionen sichtbar zu machen und sie in den persistenten Speicher zu schreiben (wenn DuckDB im persistenten Modus verwendet wird). Um eine Transaktion zu committen, führen Sie aus:

COMMIT;

Wenn Sie sich nicht in einer aktiven Transaktion befinden, schlägt die COMMIT-Anweisung fehl.

Eine Transaktion zurückrollen

Sie können eine Transaktion abbrechen. Diese Operation, auch Rollback genannt, verwirft alle Änderungen, die die Transaktion an der Datenbank vorgenommen hat. Um eine Transaktion abzubrechen, führen Sie aus:

ROLLBACK;

Sie können auch den Abort-Befehl verwenden, der dasselbe Verhalten hat:

ABORT;

Wenn Sie sich nicht in einer aktiven Transaktion befinden, schlagen die Anweisungen ROLLBACK und ABORT fehl.

Transaktionen mit mehreren Anweisungen

Wenn mehrere SQL-Anweisungen gemeinsam übergeben werden (z. B. durch Semikolons getrennt), werden sie innerhalb einer einzigen impliziten Transaktion ausgeführt. Schlägt eine Anweisung fehl, werden alle vorhergehenden Anweisungen im Batch zurückgerollt. Das gilt auch für PRAGMA-Befehle, die in mehrere interne Operationen zerlegt werden, etwa COPY FROM DATABASE.

Isolationsstufe

Das Nebenläufigkeitsmodell von DuckDB garantiert Snapshot Isolation. Transaktionen, die diese Isolationsstufe verletzen, werden abgebrochen.

Gemäß den Transaktionsisolationsstufen von PostgreSQL garantiert DuckDB Repeatable Reads.

Beispiel

Wir veranschaulichen die Verwendung von Transaktionen anhand eines einfachen Beispiels.

CREATE TABLE person (name VARCHAR, age BIGINT);
BEGIN TRANSACTION;
INSERT INTO person VALUES ('Ada', 52);
COMMIT;
BEGIN TRANSACTION;
DELETE FROM person WHERE name = 'Ada';
INSERT INTO person VALUES ('Bruce', 39);
ROLLBACK;
SELECT * FROM person;

Die erste Transaktion (Einfügen von „Ada“) wurde committet, die zweite (Löschen von „Ada“ und Einfügen von „Bruce“) wurde abgebrochen. Daher enthält die resultierende Tabelle nur <'Ada', 52>.