CodeGym /Kurse /SQL SELF /Verschachtelte Transaktionen: SAVEPOINT, ROLLBACK TO SAVE...

Verschachtelte Transaktionen: SAVEPOINT, ROLLBACK TO SAVEPOINT

SQL SELF
Level 53 , Lektion 0
Verfügbar

In PostgreSQL gibt es KEINE echten verschachtelten Transaktionen im klassischen Sinne. Es gibt nur eine äußere Transaktion und "Schichten" von Savepoints darin.

Der Begriff "verschachtelte Transaktionen" in PostgreSQL bedeutet normalerweise die Verwendung von Savepoints mit den Befehlen SAVEPOINT, ROLLBACK TO SAVEPOINT, RELEASE SAVEPOINT. Das sind keine eigenständigen unabhängigen Transaktionen, sondern spezielle Checkpoints innerhalb einer äußeren Transaktion, zu denen du zurückspringen kannst, ohne die ganze Transaktion zurückzusetzen.

Ein Beispiel aus dem echten Leben: Du schreibst einen langen Text im Editor und drückst zwischendurch immer mal wieder ctrl+s. Wenn du Fehler gemacht hast, kannst du zu einer der vorherigen gespeicherten Versionen zurückspringen, ohne deinen ganzen Fortschritt zu verlieren.

Befehle zum Verwalten von Savepoints

Um verschachtelte Transaktionen zu steuern, stellt PostgreSQL drei Hauptbefehle bereit:

SAVEPOINT

Mit diesem Befehl erstellst du einen "Savepoint", zu dem du bei Bedarf zurückkehren kannst. So ein Punkt funktioniert wie ein Kontrollpunkt in deiner Transaktion.

SAVEPOINT mypoint;

ROLLBACK TO SAVEPOINT

Setzt einen Teil der Änderungen zurück, die nach dem angegebenen Savepoint gemacht wurden, lässt aber frühere Änderungen innerhalb derselben äußeren Transaktion unberührt.

ROLLBACK TO SAVEPOINT mypoint;

RELEASE SAVEPOINT

Löscht den Savepoint. Danach kannst du nicht mehr zu diesem Punkt zurückspringen.

RELEASE SAVEPOINT mypoint;

Beispiel: Daten in mehrere Tabellen einfügen mit Rücksetz-Möglichkeit

Angenommen, du arbeitest an einem Bestellmanagement-System, wo du Daten gleichzeitig in zwei Tabellen speichern musst: orders und order_items. Ein Fehler beim Einfügen in eine Tabelle soll nicht dazu führen, dass die Daten in der anderen Tabelle verloren gehen.

BEGIN; -- Start der Transaktion

-- Savepoint erstellen
SAVEPOINT before_order;

-- Bestellung in die Tabelle orders einfügen
INSERT INTO orders (order_id, customer_id, date)
VALUES (1, 101, CURRENT_DATE);

-- Falls hier ein Fehler auftritt — zurückspringen
SAVEPOINT before_order_items;

-- Artikel in die Tabelle order_items einfügen
INSERT INTO order_items (order_id, product_id, quantity)
VALUES (1, 2001, 4);

-- Wenn etwas schiefgeht
-- ROLLBACK TO SAVEPOINT before_order_items;

-- Transaktion bestätigen (Änderungen speichern)
COMMIT;

Wenn beim Einfügen in order_items ein Fehler passiert, kannst du zum Savepoint before_order_items zurückspringen, und die Änderungen in der Tabelle orders bleiben erhalten.

Praktische Tipps und typische Fehler

Jetzt, wo du weißt, wie die Befehle SAVEPOINT und ROLLBACK TO SAVEPOINT funktionieren, hier ein paar Empfehlungen, damit du keine Probleme bekommst:

  1. Namen für Savepoints. Verwende verständliche und eindeutige Namen für SAVEPOINT. Zum Beispiel before_insert, step1 und so weiter – das hilft dir beim Debuggen.
  2. Vergiss nicht, SAVEPOINT freizugeben. Wenn du nicht mehr zu einem Savepoint zurückkehren willst, lösche ihn mit RELEASE SAVEPOINT, damit deine Transaktion nicht zugemüllt wird.
  3. Verschachtelte Transaktion ≠ eigenständige Transaktion. Denk dran: Wenn du COMMIT ausführst, gehen alle Savepoints verloren. Nach einem äußeren COMMIT kannst du nicht mehr zurückspringen.
  4. Sperren von Daten. Auch wenn du zu einem Savepoint zurückspringst, bleiben Sperren auf Datensätze, die in der Transaktion gesetzt wurden, bestehen. Das ist wichtig, wenn du in einer Multi-User-Umgebung arbeitest.

Verschachtelte Transaktionen mit SAVEPOINT und ROLLBACK TO SAVEPOINT geben dir als Entwickler ein mächtiges Werkzeug für komplexe Situationen. Jetzt kannst du Transaktionen in flexible Phasen aufteilen, Fehler sauber behandeln und unnötige Datenrücksetzungen vermeiden. Denk dran: Immer wenn du das Wort "Rollback" siehst, ist das nicht unbedingt ein Grund zur Panik – manchmal ist ein Rollback der beste Weg, um weiterzukommen.

Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION