CodeGym /Kurse /SQL SELF /Grundlegende Befehle für die Arbeit mit Transaktionen: <...

Grundlegende Befehle für die Arbeit mit Transaktionen: BEGIN, COMMIT, ROLLBACK

SQL SELF
Level 39 , Lektion 1
Verfügbar

Damit alle Änderungen in deiner Datenbank unter Kontrolle bleiben und korrekt ausgeführt werden, verwendet PostgreSQL das Konzept der Transaktion. Das ist eine Gruppe von SQL-Operationen, die als eine Einheit ausgeführt werden. Wenn etwas schiefgeht, müssen die Änderungen zurückgenommen werden. Genau hier kommen die Befehle BEGIN, COMMIT und ROLLBACK ins Spiel.

Transaktionsbefehle sind nicht nur für die Ordnung da – sie spielen eine Schlüsselrolle beim Schutz deiner Daten vor Fehlern und Abstürzen. Wenn du eine Serie von SQL-Operationen durchführst, ist es wichtig, sicher zu sein, dass alles korrekt läuft: Wenn ein Befehl fehlschlägt, soll die Datenbank in den Ursprungszustand zurückkehren. Das ist einer der Hauptgründe, warum Transaktionsbefehle überhaupt existieren – sie helfen, die Konsistenz der Daten zu bewahren.

Außerdem sorgen Transaktionen für sogenannte Atomarität: Entweder werden alle Änderungen zusammen übernommen, oder keine einzige. So wird verhindert, dass die Datenbank „halb aktualisiert“ ist – zum Beispiel Geld abgebucht, aber die Ware nicht zur Bestellung hinzugefügt.

Und natürlich geben Transaktionen dir Flexibilität. Du kannst komplexe Aktionsketten bauen, kontrollieren, wann du sie mit COMMIT festschreibst oder mit ROLLBACK zurücknimmst, und sogar gezielte Rücknahmen mit SAVEPOINT machen. Das macht die Arbeit mit der Datenbank nicht nur sicher, sondern auch steuerbar.

Befehl BEGIN

Der Befehl BEGIN sagt PostgreSQL, dass eine Transaktion startet. Nach der Ausführung bleiben alle Änderungen, die du machst, „in der Schwebe“, bis du die Transaktion mit COMMIT abschließt oder die Änderungen mit ROLLBACK zurücknimmst.

Klassisches Beispiel: Angenommen, du willst 100 Einheiten Währung von einem Konto auf ein anderes überweisen. Du startest die Transaktion mit BEGIN:

BEGIN;
-- Transaktion gestartet
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
-- Kontostand auf Konto 1 verringert
UPDATE accounts SET balance = balance + 100 WHERE account_id = 2;
-- Kontostand auf Konto 2 erhöht
Wichtig:

Solange du Befehle innerhalb einer Transaktion ausführst, sehen andere Datenbanknutzer deine Änderungen nicht. Sie werden erst nach COMMIT sichtbar.

Befehl COMMIT

Der Befehl COMMIT beendet die Transaktion und speichert alle in ihrem Rahmen gemachten Änderungen in der Datenbank. Nach diesem Befehl sind die Änderungen für alle Nutzer sichtbar.

Beispiel für den Abschluss einer Transaktion:

COMMIT;
-- Alle Änderungen in der Transaktion gespeichert

Jetzt sind die Kontostandsänderungen aus dem obigen Beispiel „dauerhaft“. Das Geld wurde erfolgreich überwiesen.

Befehl ROLLBACK

Wenn du während der Transaktion einen Fehler bemerkst oder die Änderungen zurücknehmen willst, kannst du den Befehl ROLLBACK verwenden. Er macht alle Operationen rückgängig, die nach dem BEGIN ausgeführt wurden.

Angenommen, beim Überweisen des Geldes stellst du fest, dass das Konto nicht genug Guthaben hat. Dann wird die Transaktion zurückgesetzt:

BEGIN;
-- Transaktion gestartet
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;

-- Ups, Fehler: nicht genug Guthaben.
ROLLBACK;
-- Alle Änderungen zurückgenommen, Datenbank in Ursprungszustand versetzt

Nach dem Befehl ROLLBACK werden keine Änderungen in der Datenbank gespeichert. Das ist super praktisch, um Fehler zu vermeiden.

Komplettes Beispiel: Geldüberweisung zwischen Konten

Lass uns alles zusammenbringen. Hier ein komplettes Beispiel für eine Transaktion – mit Kontostandsprüfung, Geldüberweisung und der Möglichkeit, bei Fehlern zurückzurollen:

BEGIN;
-- Transaktion starten

-- Kontostand prüfen
SELECT balance INTO current_balance FROM accounts WHERE account_id = 1;

-- Prüfen, ob genug Guthaben vorhanden ist
IF current_balance >= 100 THEN
    -- Wenn genug Guthaben, Überweisung durchführen
    UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
    UPDATE accounts SET balance = balance + 100 WHERE account_id = 2;
    COMMIT;
    -- Änderungen bestätigen
ELSE
    -- Wenn nicht genug Guthaben, Transaktion zurücknehmen
    ROLLBACK;
END IF;

Dieses Beispiel zeigt, wie Transaktionsbefehle zusammenarbeiten, um Inkonsistenzen in den Daten zu verhindern.

Wichtig

IF THEN ELSE END IF – das sind Operationen von gespeicherten Prozeduren, die wir in ein paar Levels besprechen werden :P

Besonderheit der Autocommit-Einstellung

In PostgreSQL ist standardmäßig der Autocommit-Modus aktiviert. Das heißt, wenn du Befehle außerhalb einer expliziten Transaktion ausführst, werden sie sofort in der Datenbank festgeschrieben. Zum Beispiel:

UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
-- Änderungen werden sofort gespeichert, auch ohne COMMIT

Wenn du Transaktionen manuell steuern willst, solltest du immer BEGIN für den expliziten Start einer Transaktion verwenden.

Du kannst Autocommit für die aktuelle Session mit folgendem Befehl ausschalten:

SET AUTOCOMMIT TO OFF;

Denk dran: Wenn Autocommit aus ist, musst du jede Session mit COMMIT oder ROLLBACK beenden.

Typische Fehler bei der Arbeit mit Transaktionen

Vergessenes COMMIT. Wenn du COMMIT vergisst, bleiben deine Änderungen unvollständig und gehen nach dem Ende der Session verloren.

Sperren. Solange eine Transaktion nicht abgeschlossen ist, können die von ihr genutzten Ressourcen gesperrt bleiben. Das kann zu Problemen beim parallelen Datenzugriff führen.

Überflüssiges ROLLBACK. Manchmal sind Entwickler zu vorsichtig und rollen eine Transaktion ohne Not zurück. Das führt zu wiederholten Berechnungen und erhöhter Last auf der Datenbank.

Hängende Transaktionen. Wenn du eine Transaktion startest, aber vergisst, sie zu beenden (weder COMMIT noch ROLLBACK), kann das zu hängenden Sessions und gesperrten Datenbankressourcen führen.

Praktische Anwendung

Bei Bewerbungsgesprächen für Entwickler- oder DBA-Jobs (Database Administrator) wirst du oft nach der Umsetzung von Transaktionen in PostgreSQL gefragt. Das Verständnis der Befehle BEGIN, COMMIT und ROLLBACK zeigt, dass du sicher und effizient mit Daten umgehen kannst.

In der Praxis sind Transaktionen besonders nützlich, um zuverlässige Systeme zu bauen, zum Beispiel für die Bearbeitung von Bestellungen in Online-Shops oder die Berechnung von Bonuspunkten in Loyalty-Programmen.

Jetzt, wo du die grundlegenden Transaktionsbefehle kennst, können wir weitergehen und uns spannende Themen wie SAVEPOINT und die Arbeit mit Isolationsleveln anschauen. PostgreSQL ist ein endloses Meer an Möglichkeiten – also halt dich fest.

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