Skip to article frontmatterSkip to article content

Nachdem wir die theoretischen Grundlagen des ACID-Paradigmas verstanden haben, wenden wir uns nun der praktischen Anwendung von Transaktionen zu. In diesem Abschnitt lernst du, wie Transaktionen in SQL definiert und gesteuert werden, welche Isolationsebenen zur Verfügung stehen und wie moderne Datenbanksysteme mit Nebenläufigkeit umgehen.

Der Lebenszyklus einer Transaktion

Warum ist das Verständnis des Transaktionslebenszyklus wichtig?

Als Datenbankentwickler musst du den Ablauf einer Transaktion genau verstehen, um robuste Anwendungen zu entwickeln. Stell dir vor, du implementierst ein Buchungssystem für ein Hotel: Wenn du nicht weisst, wie Transaktionen korrekt begonnen, verarbeitet und abgeschlossen werden, könntest du ungewollt Zimmer doppelt buchen oder Reservierungen verlieren.

Der Transaktionslebenszyklus bietet ein Modell, das hilft, den korrekten Ablauf zu gewährleisten und typische Fehler zu vermeiden.

Was genau ist der Lebenszyklus einer Transaktion?

Eine Transaktion durchläuft typischerweise folgende Phasen Bernstein & Newcomer (2009):

  1. Beginn (BEGIN): Die Transaktion wird gestartet und erhält eine eindeutige Transaktions-ID.
  2. Aktive Phase: SQL-Anweisungen werden ausgeführt (SELECT, INSERT, UPDATE, DELETE).
  3. Teilweiser Commit: Alle Operationen wurden ausgeführt, aber die Änderungen sind noch nicht permanent.
  4. Commit oder Rollback:
    • COMMIT: Die Änderungen werden dauerhaft in der Datenbank gespeichert.
    • ROLLBACK: Die Änderungen werden rückgängig gemacht, die Datenbank bleibt im ursprünglichen Zustand.
  5. Beendigung: Die Transaktion ist abgeschlossen, Ressourcen werden freigegeben.

Wie wird der Transaktionslebenszyklus in der Praxis umgesetzt?

In SQL sieht die Umsetzung folgendermassen aus:

-- 1. Transaktion beginnen
BEGIN TRANSACTION;

-- 2. Aktive Phase: SQL-Anweisungen ausführen
UPDATE Konten SET Kontostand = Kontostand - 1000 WHERE KontoID = 12345;
UPDATE Konten SET Kontostand = Kontostand + 1000 WHERE KontoID = 67890;

-- 3. & 4. Teilweiser Commit und Entscheidung
-- Bei Erfolg: Änderungen permanent machen
COMMIT;

-- ODER bei Problemen: Änderungen zurückrollen
-- ROLLBACK;

-- 5. Transaktion ist beendet, Ressourcen werden freigegeben

Moderne Datenbanksysteme bieten zusätzliche Kontrollfunktionen:

Transaktionssteuerung mit SQL

Warum sollte ich Transaktionen explizit steuern?

Bei einfachen SQL-Anweisungen werden Transaktionen oft implizit verwaltet (Auto-Commit). In komplexeren Szenarien ist jedoch eine explizite Steuerung unerlässlich:

Transaktionsbefehle in SQL

PostgreSQL und die meisten anderen relationalen Datenbanksysteme unterstützen folgende Grundbefehle zur Transaktionssteuerung Group (2025):

Starten einer Transaktion

-- Variante 1 (Standard SQL)
BEGIN TRANSACTION;

-- Variante 2 (PostgreSQL-Kurzform)
BEGIN;

-- Variante 3 (In manchen Systemen)
START TRANSACTION;

Erfolgreiches Beenden einer Transaktion

-- Die Änderungen werden permanent in der Datenbank gespeichert
COMMIT;

-- Alternative Syntax
COMMIT TRANSACTION;

Abbrechen einer Transaktion

-- Alle Änderungen seit BEGIN werden verworfen
ROLLBACK;

-- Alternative Syntax
ROLLBACK TRANSACTION;

Verwendung von Savepoints

-- Setzen eines Savepoints
SAVEPOINT mein_savepoint;

-- Zurückrollen bis zu einem Savepoint
ROLLBACK TO SAVEPOINT mein_savepoint;

-- Löschen eines Savepoints
RELEASE SAVEPOINT mein_savepoint;

Praktisches Beispiel: Eine Banküberweisung

BEGIN;

-- Prüfen, ob genügend Guthaben vorhanden ist
SELECT Kontostand FROM Konten WHERE KontoID = 12345;

-- Angenommen, das Ergebnis zeigt ausreichendes Guthaben...
-- Setzen eines Savepoints vor der kritischen Operation
SAVEPOINT vor_abbuchung;

-- Geld vom Senderkonto abbuchen
UPDATE Konten SET Kontostand = Kontostand - 1000 WHERE KontoID = 12345;

-- Prüfen, ob die Abbuchung erfolgreich war
SELECT Kontostand FROM Konten WHERE KontoID = 12345;

-- Wenn das Ergebnis negativ ist und dies nicht erlaubt sein soll:
-- ROLLBACK TO SAVEPOINT vor_abbuchung;
-- ROLLBACK;
-- RETURN 'Nicht genügend Guthaben';

-- Geld dem Empfängerkonto gutschreiben
UPDATE Konten SET Kontostand = Kontostand + 1000 WHERE KontoID = 67890;

-- Transaktion erfolgreich abschliessen
COMMIT;

Besonderheiten in verschiedenen Datenbanksystemen

Obwohl die grundlegende Transaktionssteuerung in SQL standardisiert ist, gibt es Unterschiede zwischen den Datenbanksystemen:

DatenbanksystemBesonderheiten
PostgreSQLUnterstützt alle Standard-Transaktionsbefehle; Automatische Rollbacks bei Fehlern innerhalb einer Transaktion
MySQL/MariaDBIn MyISAM-Tabellen keine Transaktionsunterstützung; InnoDB-Tabellen bieten volle Transaktionsunterstützung
OracleVerwendet zusätzlich SET TRANSACTION für spezielle Eigenschaften; Unterstützt autonome Transaktionen
SQL ServerErweiterte Transaktionsoptionen mit @@TRANCOUNT; Verschachtelte Transaktionen mit spezieller Semantik
SQLiteEinfacheres Transaktionsmodell; Standardmässig im Auto-Commit-Modus

Isolationsebenen und ihre Auswirkungen

Warum sind verschiedene Isolationsebenen wichtig?

Stell dir vor, du entwickelst ein Online-Ticketverkaufssystem für ein grosses Konzert. Hunderte von Benutzern versuchen gleichzeitig, Tickets zu kaufen. Hier ist die Wahl der richtigen Isolationsebene entscheidend:

Die vier Standard-Isolationsebenen

Der SQL-Standard definiert vier Isolationsebenen, die unterschiedliche Kompromisse zwischen Konsistenz und Performance bieten Microsoft (2025):

1. READ UNCOMMITTED (niedrigste Isolation)

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
BEGIN;
-- Operationen...
COMMIT;

2. READ COMMITTED

SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
BEGIN;
-- Operationen...
COMMIT;

3. REPEATABLE READ

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
BEGIN;
-- Operationen...
COMMIT;

4. SERIALIZABLE (höchste Isolation)

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
BEGIN;
-- Operationen...
COMMIT;

Übersicht der Isolationsebenen und Anomalien

IsolationsebeneDirty ReadNon-repeatable ReadPhantom Read
READ UNCOMMITTEDMöglichMöglichMöglich
READ COMMITTEDVerhindertMöglichMöglich
REPEATABLE READVerhindertVerhindertMöglich
SERIALIZABLEVerhindertVerhindertVerhindert

Isolation in PostgreSQL

PostgreSQL implementiert alle vier Standard-Isolationsebenen, hat aber einige Besonderheiten Group (2025):

Nebenläufigkeitskontrolle

Warum ist Nebenläufigkeitskontrolle wichtig?

In modernen Datenbanksystemen führen viele Benutzer gleichzeitig Transaktionen durch. Ohne geeignete Mechanismen zur Nebenläufigkeitskontrolle könnten:

Hauptansätze zur Nebenläufigkeitskontrolle

Es gibt zwei grundlegende Ansätze zur Nebenläufigkeitskontrolle in Datenbanksystemen Elmasri & Navathe (2016):

1. Sperrbasiert (Pessimistisch)

Bei dieser Methode werden Daten gesperrt, bevor sie gelesen oder geändert werden.

-- Beispiel für explizites Sperren in PostgreSQL
BEGIN;
-- Tabellensperren anfordern
LOCK TABLE konten IN EXCLUSIVE MODE;
-- Operationen...
COMMIT;

2. Mehrversionen-Parallelitätskontrolle (MVCC, Optimistisch)

Bei MVCC werden keine Sperren für lesende Zugriffe verwendet. Stattdessen sieht jede Transaktion eine “Momentaufnahme” (Snapshot) der Datenbank zu einem bestimmten Zeitpunkt.

PostgreSQL verwendet MVCC als primären Mechanismus zur Nebenläufigkeitskontrolle, kombiniert mit Sperren für bestimmte Operationen.

Deadlocks erkennen und vermeiden

Ein Deadlock entsteht, wenn zwei oder mehr Transaktionen gegenseitig auf Sperren warten, die die jeweils andere Transaktion hält:

Transaktion A hält Sperre auf Ressource 1 und wartet auf Sperre auf Ressource 2
Transaktion B hält Sperre auf Ressource 2 und wartet auf Sperre auf Ressource 1

Datenbanksysteme verwenden verschiedene Strategien, um mit Deadlocks umzugehen:

  1. Deadlock-Erkennung: Das System sucht periodisch nach Zyklen im Wartegrafen und bricht im Deadlock-Fall eine der beteiligten Transaktionen ab
  2. Deadlock-Vermeidung: Transaktionen müssen alle benötigten Ressourcen vorab anfordern oder werden in einer festgelegten Reihenfolge ausgeführt
  3. Timeouts: Transaktionen werden abgebrochen, wenn sie zu lange auf eine Sperre warten

PostgreSQL verwendet primär Deadlock-Erkennung und Timeouts:

-- Timeout für Sperren festlegen (in Millisekunden)
SET lock_timeout = 5000; -- 5 Sekunden

BEGIN;
-- Operationen...
COMMIT;

Optimistische vs. Pessimistische Nebenläufigkeitskontrolle

Die Wahl zwischen optimistischer und pessimistischer Nebenläufigkeitskontrolle hängt vom Anwendungsfall ab:

EigenschaftPessimistisch (Sperren)Optimistisch (MVCC)
KonfliktwahrscheinlichkeitGut bei hoher KonfliktwahrscheinlichkeitGut bei niedriger Konfliktwahrscheinlichkeit
LesevorgängeBlockiert bei SchreibsperrenNicht blockiert durch Schreibvorgänge
SchreibvorgängeWartet auf SperrenPrüft auf Konflikte vor dem Commit
SpeicherverbrauchGeringerHöher durch Mehrversionen
Typische AnwendungenFinanztransaktionenWebanwendungen mit vielen Lesevorgängen

Zusammenfassung

Transaktionen sind das Herzstück moderner Datenbanksysteme und ermöglichen die sichere und konsistente Verarbeitung von Daten, selbst in hochparallelen Umgebungen. In diesem Abschnitt haben wir gelernt:

Im nächsten Abschnitt werden wir auf Herausforderungen und Lösungsansätze eingehen, die bei der Arbeit mit Transaktionen auftreten können, sowie die Grenzen des ACID-Paradigmas in verteilten Systemen betrachten.

References
  1. Bernstein, P. A., & Newcomer, E. (2009). Principles of Transaction Processing (2nd ed.). Morgan Kaufmann.
  2. Group, P. G. D. (n.d.). PostgreSQL Documentation: Transactions. PostgreSQL. Retrieved March 21, 2025, from https://www.postgresql.org/docs/current/tutorial-transactions.html
  3. Microsoft. (n.d.). ACID Properties in SQL Server. Microsoft. Retrieved March 21, 2025, from https://learn.microsoft.com/en-us/sql/relational-databases/sql-server-transaction-locking-and-row-versioning-guide
  4. Elmasri, R., & Navathe, S. B. (2016). Fundamentals of Database Systems (7th ed.). Pearson.