Transaktionen
Die wichtigsten Befehle zum Merken
psql -X -d lab— die Testdatenbank ohne Startanpassungen öffnen.BEGIN/COMMIT— eine Transaktion in psql beginnen und bestätigen.ROLLBACK— Änderungen der aktuellen Transaktion verwerfen.
Befehle und Optionen
| Befehl oder Syntax | Bedeutung |
|---|---|
-X -d lab |
psql-Startdateien überspringen und Datenbank lab wählen. |
CREATE TEMP TABLE |
Sitzungslokale Tabelle erstellen; sie verschwindet beim Verbindungsende. |
integer NOT NULL |
Ganze Zahlen speichern und Nullwerte verbieten. |
INSERT / UPDATE / SELECT |
Startzeile hinzufügen / Betrag ändern / lesen. |
BEGIN / COMMIT / ROLLBACK |
Transaktion beginnen / bestätigen / verwerfen. |
; / \q |
SQL-Anweisung beenden / psql verlassen. |
100 ist ein Testsaldo in beliebigen ganzen Einheiten, kein echtes Konto oder Währungsbetrag.
Die entscheidenden Konzepte
1. Eine Transaktion bündelt eine logische Änderung
Eine Transaktion fasst Datenbankoperationen zu einer Einheit zusammen. Bei einer Überweisung sollen Abzug und Gutschrift gemeinsam gelingen oder gemeinsam verworfen werden.
Ohne ausdrückliche Transaktion behandelt PostgreSQL normalerweise jede erfolgreiche Anweisung als eigene Transaktion. Mehrere Anweisungen im selben Terminal bilden nicht automatisch eine Alles-oder-nichts-Einheit. Die Grenze muss zur fachlichen Änderung passen.
2. Commit und Rollback entscheiden das Ergebnis
Eine Sitzung sieht innerhalb einer Transaktion ihre eigenen Änderungen. COMMIT bestätigt diese; ROLLBACK verwirft sie. Ein vor Commit gelesener neuer Wert beweist deshalb keine bestätigte Änderung.
Verbindungsverlust bei offener Transaktion verwirft unbestätigte Arbeit. Bricht die Verbindung während Commit ab, kann dessen Erfolg für den Client unklar bleiben. Blinde Wiederholung kann dann einen doppelten Effekt erzeugen.
3. ACID beschreibt verschiedene Eigenschaften
Atomarität behandelt die Transaktion als Einheit. Konsistenz betrifft eingehaltene Invarianten. Isolation bestimmt Wechselwirkungen gleichzeitiger Transaktionen. Dauerhaftigkeit betrifft bestätigte Änderungen unter den konfigurierten Ausfallgarantien.
Diese Eigenschaften erfinden keine fehlenden Geschäftsregeln. Bedingungen und korrekte Anwendungslogik müssen festlegen, welchen Regeln Salden oder Beziehungen genügen. Auch verhält sich nicht jede Isolationsstufe wie vollständig nacheinander ausgeführte Transaktionen.
4. Die Grenze umfasst nicht automatisch andere Systeme
Ein Rollback versendet keine E-Mail zurück und macht keinen externen HTTP-Aufruf rückgängig. Solche Effekte liegen außerhalb, sofern kein ausdrücklicher Koordinationsentwurf sie verbindet.
Halte Datenbankänderungen und externe Zustellung auseinander. Ein in derselben Transaktion gespeichertes Ausgangsereignis kann spätere zuverlässige Lieferung unterstützen, braucht aber weiterhin Wiederholungs- und Duplikatregeln. Temporäre Tabellen demonstrieren hier SQL-Verhalten, keine absturzfeste Anwendungsspeicherung.
Ein kleines Beispiel
Optional: Öffne psql mit Block eins und gib dort die SQL-Anweisungen der Reihe nach ein. Untersuche Fehler vor dem Fortfahren. Der letzte Befehl gehört an den psql-Prompt.
psql -X -d lab
CREATE TEMP TABLE lab_balance (amount integer NOT NULL);
INSERT INTO lab_balance VALUES (100);
BEGIN;
UPDATE lab_balance SET amount = amount - 30;
SELECT amount FROM lab_balance;
ROLLBACK;
SELECT amount FROM lab_balance;
BEGIN;
UPDATE lab_balance SET amount = amount - 30;
COMMIT;
SELECT amount FROM lab_balance;
\q
Die Abfragen sollten zuerst 70, nach Rollback 100 und nach dem zweiten Commit 70 zeigen. Das sind aus den Anweisungen abgeleitete Erwartungen, keine erfasste Ausgabe.
Eine Sitzung kann also eine später verworfene Änderung sehen. Gleichzeitige Sitzungen und Stromausfallwiederherstellung werden nicht getestet. \q beendet die Sitzung und entfernt die temporäre Tabelle samt bestätigter Testzeile. Vorhandene Tabellen bleiben unberührt.
Merke dir: Eine Transaktion macht zusammengehörige Datenbankänderungen zu einer Entscheidung. Ihre Grenze muss die gemeinsam erfolgreiche oder erfolglose Arbeit umfassen.