🔒Transaktionen und Isolationslevel

Eine Transaktion fasst mehrere Anweisungen zu einer Einheit zusammen: BEGIN … COMMIT (bestätigen) oder ROLLBACK (verwerfen). Spannend wird es, wenn zwei Sitzungen gleichzeitig arbeiten.

🧪ACID

A
Atomicity – Atomarität

Alles oder nichts: Scheitert eine Anweisung, wird die ganze Transaktion zurückgerollt. Keine halbe Überweisung.

C
Consistency – Konsistenz

Nach dem COMMIT gelten alle Regeln (Schlüssel, CHECK, Fremdschlüssel) wieder.

I
Isolation

Gleichzeitige Transaktionen stören sich nicht – wie stark, legt das Isolationslevel fest.

D
Durability – Dauerhaftigkeit

Was bestätigt ist, übersteht auch einen Absturz (Write-Ahead-Log).

⏱️Zwei Sitzungen auf einer Zeitleiste

Sitzung A ändert den Lagerbestand, Sitzung B liest. Wähle Phänomen und Isolationslevel von B und gehe Schritt für Schritt durch.

A bucht 5 Exemplare aus, bricht dann aber ab (ROLLBACK). Hat B zwischendurch 5 gelesen, hat B mit einem Wert gearbeitet, den es nie gab.

Zeit
Sitzung A (schreibt)
Sitzung B (liest, READ UNCOMMITTED)
t1
BEGIN;
t2
BEGIN;
t3
UPDATE lager SET bestand = bestand - 5 WHERE buch_id = 7;
t4
SELECT bestand FROM lager WHERE buch_id = 7;
t5
ROLLBACK;
t6
SELECT bestand FROM lager WHERE buch_id = 7;
t7
COMMIT;
Schritt 1 / 7 · Tasten ← →

Tabelle lager nach t1

buch_idtitelbestätigtA (offen)
7SQL für Neugierige10
8Datenflüsse4
9Kirschblüten im Schnee2

Was der SQL-Standard zulässt

LevelDirty ReadNon-repeatable ReadPhantom Read
READ UNCOMMITTEDmöglichmöglichmöglich
READ COMMITTEDverhindertmöglichmöglich
REPEATABLE READverhindertverhindertmöglich
SERIALIZABLEverhindertverhindertverhindert

Die Simulation oben erzeugt genau diese Tabelle – das prüft ein automatischer Test für alle 12 Kombinationen.

PostgreSQL

Standard READ COMMITTED. READ UNCOMMITTED verhält sich wie READ COMMITTED; REPEATABLE READ ist Snapshot-Isolation und verhindert auch Phantome.

MySQL / MariaDB (InnoDB)

Standard REPEATABLE READ mit konsistentem Snapshot für normale SELECTs; Next-Key-Locks bei sperrenden Lesezugriffen (… FOR UPDATE).

SQL Server

Standard READ COMMITTED (mit Sperren, optional READ_COMMITTED_SNAPSHOT); zusätzlich Level SNAPSHOT.

Oracle

Kennt nur READ COMMITTED (Standard) und SERIALIZABLE (Snapshot-basiert); Leser blockieren Schreiber nie.

SQLite

Transaktionen sind serialisierbar (ein Schreiber zur Zeit); PRAGMA read_uncommitted wirkt nur im Shared-Cache-Modus.

↩️COMMIT, ROLLBACK, SAVEPOINT ausprobieren

SQL-Engine wird geladen …
💡 Autocommit
Ohne BEGIN ist in den meisten Systemen jede Anweisung ihre eigene Transaktion und wird sofort bestätigt.
⚠️ Lost Update
Zwei Sitzungen lesen denselben Bestand (10), beide ziehen 1 ab und schreiben 9 – eine Buchung ist verloren. Abhilfe: UPDATE … SET bestand = bestand - 1 in einem Schritt, SELECT … FOR UPDATE (Sperre) oder ein höheres Isolationslevel.
✅ Deadlock
Warten zwei Transaktionen gegenseitig auf Sperren, bricht die Datenbank eine davon ab. Die Anwendung sollte die Transaktion dann einfach wiederholen.