Zuletzt aktualisiert am 05.12.2025 5 Minuten Lesezeit

Transaktion

Eine Transaktion ist eine Folge von Datenbankoperationen, die als eine logische Einheit betrachtet und ausgeführt werden. Entweder werden alle Operationen der Transaktion erfolgreich abgeschlossen, oder keine einzige. Dieses Alles-oder-Nichts-Prinzip ist fundamental für die Datenintegrität in relationalen Datenbanken.

Ein klassisches Beispiel ist eine Banküberweisung: Das Abbuchen vom Senderkonto und das Gutschreiben auf dem Empfängerkonto müssen beide erfolgen oder beide fehlschlagen. Würde nur eine Operation ausgeführt, wäre der Datenbestand inkonsistent.

Die ACID-Eigenschaften

Transaktionen in Datenbankmanagementsystemen (DBMS) müssen vier grundlegende Eigenschaften erfüllen, die unter dem Akronym ACID zusammengefasst werden. Diese Eigenschaften garantieren die Zuverlässigkeit und Konsistenz der Daten, selbst bei Systemausfällen oder gleichzeitigen Zugriffen mehrerer Benutzer.

Atomicity (Atomarität)

Atomarität bedeutet, dass eine Transaktion als unteilbare Einheit behandelt wird. Entweder werden alle enthaltenen Operationen vollständig ausgeführt (Commit), oder bei einem Fehler werden alle Änderungen rückgängig gemacht (Rollback). Es gibt keinen Zwischenzustand.

-- Beispiel: Atomare Banküberweisung
START TRANSACTION;

UPDATE konten SET saldo = saldo - 100 WHERE konto_id = 1;
UPDATE konten SET saldo = saldo + 100 WHERE konto_id = 2;

-- Entweder beide oder keine Aenderung
COMMIT;

Consistency (Konsistenz)

Konsistenz stellt sicher, dass eine Transaktion die Datenbank von einem gültigen Zustand in einen anderen gültigen Zustand überführt. Alle definierten Regeln und Constraints wie Primärschlüssel, Fremdschlüssel oder CHECK-Constraints müssen vor und nach der Transaktion erfüllt sein.

Verletzt eine Transaktion eine dieser Regeln, wird sie abgebrochen und zurückgerollt. So kann beispielsweise kein negativer Kontostand entstehen, wenn ein entsprechender Constraint definiert ist.

Isolation

Isolation garantiert, dass parallel laufende Transaktionen sich nicht gegenseitig beeinflussen. Jede Transaktion arbeitet so, als wäre sie die einzige im System. Die Änderungen einer Transaktion werden erst nach dem Commit für andere Transaktionen sichtbar.

Es gibt verschiedene Isolationslevel, die einen Kompromiss zwischen Datenkonsistenz und Performance ermöglichen:

Isolationslevel Dirty Read Non-Repeatable Read Phantom Read
Read Uncommitted Möglich Möglich Möglich
Read Committed Verhindert Möglich Möglich
Repeatable Read Verhindert Verhindert Möglich
Serializable Verhindert Verhindert Verhindert

Je höher das Isolationslevel, desto sicherer sind die Daten vor Anomalien geschützt, aber desto mehr wird die parallele Verarbeitung eingeschränkt. In der Praxis wählt man das passende Level je nach Anwendungsfall.

Durability (Dauerhaftigkeit)

Dauerhaftigkeit garantiert, dass erfolgreich abgeschlossene Transaktionen permanent in der Datenbank gespeichert bleiben. Selbst bei einem Systemabsturz, Stromausfall oder anderen Störungen gehen die Daten nicht verloren. Das DBMS schreibt die Änderungen in ein Transaction Log, bevor es den Commit bestätigt.

Transaktionssteuerung in SQL

In SQL steuert man Transaktionen mit speziellen Befehlen. Die genaue Syntax kann je nach Datenbanksystem leicht variieren, aber die Grundprinzipien sind überall gleich.

-- Transaktion starten
START TRANSACTION;  -- oder BEGIN in manchen DBMS

-- Datenbankoperationen ausführen
INSERT INTO bestellungen (kunde_id, datum) VALUES (42, NOW());
UPDATE lagerbestand SET menge = menge - 1 WHERE artikel_id = 123;

-- Bei Erfolg: Änderungen dauerhaft speichern
COMMIT;

-- Bei Fehler: Alle Änderungen zurücknehmen
ROLLBACK;

Savepoints

Mit Savepoints kannst du innerhalb einer Transaktion Zwischenpunkte setzen, zu denen du bei Bedarf zurückspringen kannst, ohne die gesamte Transaktion abzubrechen.

START TRANSACTION;

INSERT INTO protokoll (aktion) VALUES ('Schritt 1');
SAVEPOINT nach_schritt_1;

INSERT INTO protokoll (aktion) VALUES ('Schritt 2');
-- Fehler erkannt: Nur Schritt 2 zurücknehmen
ROLLBACK TO nach_schritt_1;

-- Schritt 1 bleibt erhalten
COMMIT;

Concurrency-Probleme und Locking

Wenn mehrere Transaktionen gleichzeitig auf dieselben Daten zugreifen, können ohne geeignete Schutzmechanismen verschiedene Probleme auftreten. Das DBMS verwendet Sperrmechanismen (Locking), um diese zu verhindern.

Typische Anomalien

Diese drei Anomalien können bei unzureichender Isolation auftreten:

  • Dirty Read: Eine Transaktion liest Daten, die von einer anderen Transaktion geändert, aber noch nicht committed wurden. Wird die andere Transaktion zurückgerollt, hat man ungültige Daten gelesen.
  • Non-Repeatable Read: Dieselbe Abfrage liefert innerhalb einer Transaktion unterschiedliche Ergebnisse, weil eine andere Transaktion dazwischen Daten geändert hat.
  • Phantom Read: Bei wiederholten Abfragen erscheinen plötzlich neue Zeilen, weil eine andere Transaktion Datensätze eingefügt hat.

Sperrmechanismen

Datenbanken verwenden verschiedene Arten von Sperren, um den gleichzeitigen Zugriff zu koordinieren:

  • Shared Lock (S-Lock): Erlaubt anderen Transaktionen das Lesen, aber nicht das Schreiben
  • Exclusive Lock (X-Lock): Blockiert sowohl Lesen als auch Schreiben durch andere Transaktionen
  • Row-Level Locking: Sperrt nur einzelne Zeilen, ermöglicht hohe Parallelität
  • Table-Level Locking: Sperrt ganze Tabellen, einfacher aber weniger performant

Deadlocks

Ein Deadlock entsteht, wenn zwei oder mehr Transaktionen gegenseitig auf die Freigabe von Sperren warten. Transaktion A hält eine Sperre und wartet auf eine Ressource von B, während B auf eine Ressource von A wartet. Das DBMS erkennt solche Situationen und bricht eine der Transaktionen ab, um den Deadlock aufzulösen.

Transaktionen in der Anwendungsentwicklung

In der Softwareentwicklung arbeitest du oft nicht direkt mit SQL-Befehlen, sondern verwendest Frameworks und ORMs, die die Transaktionsverwaltung abstrahieren. Das Grundprinzip bleibt jedoch dasselbe.

// Beispiel in Java mit JDBC
Connection conn = dataSource.getConnection();
try {
    conn.setAutoCommit(false);  // Transaktion starten

    // Datenbankoperationen
    stmt.executeUpdate("UPDATE konten SET saldo = saldo - 100 WHERE id = 1");
    stmt.executeUpdate("UPDATE konten SET saldo = saldo + 100 WHERE id = 2");

    conn.commit();  // Bei Erfolg
} catch (SQLException e) {
    conn.rollback();  // Bei Fehler
    throw e;
}

Moderne Frameworks wie Spring bieten deklarative Transaktionsverwaltung mit Annotationen, was den Code übersichtlicher macht und Fehler reduziert.

Transaktionen in der Praxis

Das Verständnis von Transaktionen ist für Fachinformatiker für Anwendungsentwicklung essenziell. Du begegnest ihnen bei der Entwicklung von Webanwendungen, Enterprise-Software und überall dort, wo Datenintegrität wichtig ist.

Typische Anwendungsfälle sind Finanztransaktionen, Bestellprozesse in Online-Shops, Buchungssysteme und alle Szenarien, in denen mehrere zusammenhängende Datenänderungen atomar ausgeführt werden müssen.

Quellen und weiterführende Links