TATECHATLAS
◎ Deutsch
Daten und Datenbanken

Wie BEGIN, COMMIT und ROLLBACK mehrere Änderungen in einer einzigen Operation in PostgreSQL kombinieren

Transaktionen in PostgreSQL ermöglichen es, SQL-Operationen mithilfe der Befehle BEGIN, COMMIT und ROLLBACK in atomare Blöcke zu gruppieren. Dies gewährleistet die Datenintegrität: Entweder werden alle Änderungen angewendet oder keine. Das Verfahren basiert auf den ACID-Prinzipien - Atomarität, Konsistenz, Isolation und Dauerhaftigkeit.

Auf dieser Seite

Die Befehle BEGIN, COMMIT und ROLLBACK in PostgreSQL verwalten einen Transaktionsblock, der mehrere Operationen in eine einzige logische Einheit zusammenfasst. Wenn BEGIN ausgeführt wird, beginnt eine Transaktion; nachfolgende Änderungen werden nicht sofort gespeichert. Bei COMMIT werden alle Änderungen dauerhaft gesichert. Bei ROLLBACK werden alle Änderungen seit BEGIN rückgängig gemacht. Dies garantiert Atomarität - entweder gelingen alle Schritte, oder keiner beeinflusst die Datenbank.

Einführung in Transaktionen in PostgreSQL

Transaktionen sind grundlegend für zuverlässige Datenbankoperationen. Sie ermöglichen es, mehrere SQL-Anweisungen in eine einzelne logische Einheit zu gruppieren, die als 'alles oder nichts' ausgeführt wird. Dies ist entscheidend für die Aufrechterhaltung der Datenintegrität, besonders in Systemen, bei denen Fehler zu inkonsistenten Zuständen führen könnten, wie z. B. bei Geldüberweisungen.

PostgreSQL implementiert Transaktionen gemäß den ACID-Prinzipien: Atomarität, Konsistenz, Isolation und Dauerhaftigkeit. Wie in der Dokumentation angegeben, 'gruppiert eine Transaktion mehrere Schritte zu einer unteilbaren Operation' - wenn ein Fehler auftritt, wirken sich keine Zwischenänderungen auf die Datenbank aus.

Syntax von BEGIN, COMMIT und ROLLBACK

Um eine Transaktion explizit zu verwalten, werden drei Befehle verwendet: BEGIN, COMMIT und ROLLBACK. BEGIN startet einen Transaktionsblock. Alle nachfolgenden Operationen werden innerhalb dieser Transaktion ausgeführt. COMMIT macht alle Änderungen dauerhaft. ROLLBACK hebt alle Änderungen seit BEGIN auf.

Beispiel: Eine Überweisung von 100 Dollar von Alice an Bob wird als einzelne Transaktion durchgeführt:

Das Beispiel überträgt unter der Annahme einer Tabelle accounts mit einem eindeutigen Namen und einem numerischen Saldo, wobei Zeilen für Alice und Bob vorhanden sind. Das Beispiel mit Savepoint setzt zusätzlich eine Zeile für Wally voraus. Führen Sie die Anweisungen in einer kontrollierten Demonstrationsdatenbank aus. In Anwendungscode sollten Sie die Anzahl der betroffenen Zeilen, ausreichende Mittel und erforderliche Einschränkungen überprüfen; ein erfolgreicher COMMIT allein beweist nicht, dass der beabsichtigte Geschäftsprozess stattgefunden hat.

BEGIN;
UPDATE accounts SET balance = balance - 100.00 WHERE name = 'Alice';
UPDATE accounts SET balance = balance + 100.00 WHERE name = 'Bob';
COMMIT;

Atomarität der Änderungen

Atomarität bedeutet, dass eine Transaktion entweder vollständig erfolgreich ist oder komplett zurückgesetzt wird. Zwischenzustände werden nicht gespeichert. Zum Beispiel, wenn Geld von Alicens Konto abgebucht wird, aber ein Fehler vor der Gutschrift an Bob auftritt, wird die gesamte Transaktion zurückgesetzt und Alicens Guthaben wird wiederhergestellt.

WAL-Einträge müssen in dauerhafte Speicherung geschrieben sein, bevor die entsprechenden geänderten Datenseiten geschrieben werden. Datenseiten können vor dem COMMIT geschrieben werden; Atomarität bedeutet nicht, dass Änderungen im Arbeitsspeicher bis zum Commit warten. Die Crash-Wiederherstellung nutzt das Log, während Sichtbarkeitsregeln verhindern, dass andere Sitzungen unbestätigte Tabellenänderungen sehen.

Automatische Transaktionen per Voreinstellung

Außerhalb eines expliziten Transaktionsblocks führt PostgreSQL jede Anweisung in einer eigenen impliziten Transaktion aus. Client-Bibliotheken können automatisch eine Transaktion starten oder eine Autocommit-Option bereitstellen, daher sollten Sie die Verbindungseinstellungen prüfen, bevor Sie davon ausgehen, dass zwei Anweisungen unabhängig sind.

Dieser Modus ist für einfache Operationen praktisch, aber wenn mehrere Befehle konsistent ausgeführt werden müssen, sind explizite BEGIN und COMMIT erforderlich, um teilweise Anwendungen von Änderungen zu vermeiden.

Fehlerbehandlung: Rückgängigmachen von Änderungen

Wenn während einer Transaktion eine Bedingung auftritt, die sie ungültig macht (z. B. negatives Guthaben), kann ROLLBACK ausgeführt werden. Alle Änderungen seit Beginn der Transaktion werden rückgängig gemacht.

Zum Beispiel, wenn nach der Abbuchung von Alicens Konto ihr Guthaben negativ wird, kann die Transaktion zurückgesetzt werden, um den ursprünglichen Zustand der Datenbank wiederherzustellen.

Sichtbarkeit der Änderungen für andere Transaktionen

Änderungen innerhalb einer Transaktion sind anderen Sitzungen nicht sichtbar, bis COMMIT ausgeführt wurde. Dies gewährleistet Isolation. Andere Benutzer sehen weiterhin den vorherigen Zustand der Tabellen.

Erst nach COMMIT werden alle Änderungen gleichzeitig sichtbar, was Szenarien verhindert, in denen ein Teil einer Operation (z. B. Abbuchung) sichtbar ist, während ein anderer Teil (z. B. Gutschrift) noch nicht ist.

Isolationslevel von Transaktionen

Die SQL-Bezeichnungen sind Read Uncommitted, Read Committed, Repeatable Read und Serializable. PostgreSQL behandelt Read Uncommitted wie Read Committed, sodass die vier Bezeichnungen drei unterschiedliche Verhaltensweisen bieten. Read Committed ist der übliche Standard; diese Einstellung kann pro Sitzung oder Datenbankkonfiguration geändert werden.

Read Committed erlaubt nur die Ansicht von Daten, die vor Beginn der Abfrage bestätigt wurden. Repeatable Read bietet einen konsistenten Snapshot zum Zeitpunkt des Transaktionsbeginns. Serializable simuliert serielle Ausführung, kann jedoch Serialisierungsfehler erfordern.

Verwendung von Savepoints für partielle Rückgängigmachung

SAVEPOINT ermöglicht es, innerhalb einer Transaktion einen Punkt zu erstellen, zu dem man zurückgehen kann, ohne die gesamte Transaktion abzubrechen. Dies ist nützlich bei komplexer Logik, bei der nur ein Teil der Operation rückgängig gemacht werden muss.

Zum Beispiel, wenn nach der Überweisung an Bob festgestellt wird, dass Wally die Summe erhalten sollte, kann die Transaktion zu einem Savepoint zurückgesetzt und die Mittel umgeleitet werden.

BEGIN;
UPDATE accounts SET balance = balance - 100.00 WHERE name = 'Alice';
SAVEPOINT my_savepoint;
UPDATE accounts SET balance = balance + 100.00 WHERE name = 'Bob';
ROLLBACK TO my_savepoint;
UPDATE accounts SET balance = balance + 100.00 WHERE name = 'Wally';
COMMIT;

Was Sie prüfen sollten

  • Überprüfen Sie die Client-Transaktions- und Autocommit-Einstellungen, bevor Sie BEGIN ausführen.
  • Validieren Sie Kontostände und die Anzahl der betroffenen Zeilen; Atomarität allein stellt keine Geschäftskorrektheit sicher.
  • Nach einem Fehler in einer Anweisung führen Sie ROLLBACK aus, bevor Sie die Verbindung erneut verwenden.
  • Halten Sie Transaktionen kurz und wiederholen Sie Serialisierungsfehler gemäß der Anwendungspolitik.

Änderungen an Sequenzen (sequences) werden bei ROLLBACK nicht zurückgesetzt und sind sofort für andere Transaktionen sichtbar. Höhere Isolationslevel können Serialisierungsfehler verursachen, die eine erneute Ausführung der Transaktion erfordern.

Quellen

  1. PostgreSQL: transactions ↗
  2. PostgreSQL: transaction isolation ↗
  3. PostgreSQL: write-ahead logging ↗
Nach oben ↑