🔒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
Alles oder nichts: Scheitert eine Anweisung, wird die ganze Transaktion zurückgerollt. Keine halbe Überweisung.
Nach dem COMMIT gelten alle Regeln (Schlüssel, CHECK, Fremdschlüssel) wieder.
Gleichzeitige Transaktionen stören sich nicht – wie stark, legt das Isolationslevel fest.
Was bestätigt ist, übersteht auch einen Absturz (Write-Ahead-Log).
⏱️Zwei Sitzungen auf einer Zeitleiste
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.
BEGIN;BEGIN;UPDATE lager SET bestand = bestand - 5 WHERE buch_id = 7;SELECT bestand FROM lager WHERE buch_id = 7;ROLLBACK;SELECT bestand FROM lager WHERE buch_id = 7;COMMIT;Tabelle lager nach t1
| buch_id | titel | bestätigt | A (offen) |
|---|---|---|---|
| 7 | SQL für Neugierige | 10 | |
| 8 | Datenflüsse | 4 | |
| 9 | Kirschblüten im Schnee | 2 |
Was der SQL-Standard zulässt
| Level | 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 |
Die Simulation oben erzeugt genau diese Tabelle – das prüft ein automatischer Test für alle 12 Kombinationen.
Standard READ COMMITTED. READ UNCOMMITTED verhält sich wie READ COMMITTED; REPEATABLE READ ist Snapshot-Isolation und verhindert auch Phantome.
Standard REPEATABLE READ mit konsistentem Snapshot für normale SELECTs; Next-Key-Locks bei sperrenden Lesezugriffen (… FOR UPDATE).
Standard READ COMMITTED (mit Sperren, optional READ_COMMITTED_SNAPSHOT); zusätzlich Level SNAPSHOT.
Kennt nur READ COMMITTED (Standard) und SERIALIZABLE (Snapshot-basiert); Leser blockieren Schreiber nie.
Transaktionen sind serialisierbar (ein Schreiber zur Zeit); PRAGMA read_uncommitted wirkt nur im Shared-Cache-Modus.
↩️COMMIT, ROLLBACK, SAVEPOINT ausprobieren
UPDATE … SET bestand = bestand - 1 in einem Schritt, SELECT … FOR UPDATE (Sperre) oder ein höheres Isolationslevel.