READ UNCOMMITTED
Schwächste Stufe der Isolation. Eine Transaktion darf auch noch nicht committete (also potenziell zurückgerollte) Daten anderer Transaktionen lesen. Damit sind Dirty Reads erlaubt und alle darauf folgenden Probleme möglich. Default ist hier read only, weil das Risiko für Inkonsistenzen durch dirty reads und writes sonst zu hoch wäre. Typischer Anwendungsfall: statistische Lese-Transaktionen, bei denen nur ein ungefährer Überblick benötigt wird und keine korrekten Werte gefordert sind.
READ UNCOMMITTED verhindert nichts. Es sieht sogar schmutzige, nicht bestätigte Werte.
READ COMMITTED
Es dürfen nur endgültig geschriebene, also committete Werte gelesen werden. Damit wird der Dirty Read verhindert. Nonrepeatable Read ist jedoch weiterhin möglich: Wenn dieselbe Transaktion zweimal denselben Datensatz liest, kann zwischen den beiden Lesevorgängen eine andere Transaktion den Wert verändert und committet haben. Auch Phantom-Reads sind möglich. Dies ist die Standardstufe vieler DBMS wie Oracle und PostgreSQL.
READ COMMITTED verhindert nur Dirty Read. Nonrepeatable Read und Phantom bleiben möglich.
REPEATABLE READ
Ein einmal gelesener Datensatz bleibt innerhalb derselben Transaktion beim erneuten Lesen unverändert, d.h. Nonrepeatable Read ist ausgeschlossen. Das Phantomproblem kann jedoch weiterhin auftreten, wenn eine parallele Transaktion Datensätze einfügt oder löscht, die ein Selektionsprädikat erfüllen, das sie zuvor nicht erfüllten. REPEATABLE READ ist der Default in MySQL/MariaDB. Der Schutz wird typischerweise über Sperren oder Snapshots realisiert.
REPEATABLE READ verhindert Dirty Read und Nonrepeatable Read, aber nicht das Phantomproblem.
SERIALIZABLE
Höchste Isolationsstufe. Garantiert Serialisierbarkeit: das Ergebnis der parallelen Ausführung entspricht immer dem Ergebnis einer seriellen Ausführung der Transaktionen. Die Transaktion sieht nur Änderungen, die zu Beginn der Transaktion bereits committet waren, plus die eigenen Änderungen. Alle vier Probleme (Dirty Read, Nonrepeatable Read, Phantom, Lost Update) werden verhindert. Preis: geringste Parallelität und potenziell viele Wartezeiten oder Rollbacks.
SERIALIZABLE verhindert alle Probleme, kostet aber Performance.
Die vier Nebenläufigkeitsprobleme
Slide 16 der DBI-Folien listet die vier Probleme im Mehrbenutzerbetrieb: (1) Dirty Read - Abhängigkeit von nicht freigegebenen Daten, (2) Nonrepeatable Read - inkonsistentes Lesen innerhalb derselben Transaktion, (3) Phantom-Problem - Berechnungen auf unvollständigen Daten durch neue Datensätze, (4) Lost Update - verlorengegangene Änderungen durch Überschreiben. Isolation Levels adressieren die ersten drei; Lost Update wird typischerweise durch Locking und SERIALIZABLE verhindert.
Vier Probleme, aufsteigend adressiert: Dirty, Nonrepeatable, Phantom, Lost Update.
SET TRANSACTION Syntax
In SQL wird der Isolation Level pro Transaktion konfiguriert. Die Syntax lautet: SET TRANSACTION [READ ONLY | READ WRITE] [ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE}]. Beispiel: set transaction read write, isolation level serializable. Der Wechsel des Isolationslevels kann in bestimmten Anwendungsfällen den Systemdurchsatz erhöhen, z.B. durch höhere Parallelität reiner Lesetransaktionen.
SET TRANSACTION ISOLATION LEVEL steuert die Balance zwischen Konsistenz und Durchsatz.
Übersichtstabelle Level vs Problem
Merktabelle: READ UNCOMMITTED erlaubt alle drei Probleme (Dirty, Nonrepeatable, Phantom). READ COMMITTED verhindert Dirty Read, erlaubt Nonrepeatable und Phantom. REPEATABLE READ verhindert Dirty Read und Nonrepeatable Read, erlaubt Phantom. SERIALIZABLE verhindert alle drei. Diese Tabelle ist der zentrale Merkstoff für die Klausur und wird bei Slide 16/17 direkt abgefragt.
Von unten nach oben wird nacheinander Dirty, dann Nonrepeatable, dann Phantom verboten.
Motivation - Warum überhaupt Levels
Volle Serialisierbarkeit ist teuer: viele Sperren, wenig Parallelität, potenzielle Deadlocks. In vielen Anwendungen (z.B. Reports, Statistiken, Dashboards) ist ein bisschen Inkonsistenz akzeptabel, wenn dafür die Performance steigt. Deshalb bietet der SQL-Standard eine Aufweichung der ACID-I-Bedingung an. Die Wahl des Levels ist eine bewusste Abwägung zwischen Korrektheit und Durchsatz.
Isolation Levels sind ein bewusster Trade-off zwischen Konsistenz und Performance.