READ UNCOMMITTED
Schwaechste Stufe der Isolation. Eine Transaktion darf auch noch nicht committete (also potenziell zurueckgerollte) Daten anderer Transaktionen lesen. Damit sind Dirty Reads erlaubt und alle darauf folgenden Probleme moeglich. Default ist hier read only, weil das Risiko fuer Inkonsistenzen durch dirty reads und writes sonst zu hoch waere. Typischer Anwendungsfall: statistische Lese-Transaktionen, bei denen nur ein ungefaehrer Ueberblick benoetigt wird und keine korrekten Werte gefordert sind.
READ UNCOMMITTED verhindert nichts. Es sieht sogar schmutzige, nicht bestaetigte Werte.
READ COMMITTED
Es duerfen nur endgueltig geschriebene, also committete Werte gelesen werden. Damit wird der Dirty Read verhindert. Nonrepeatable Read ist jedoch weiterhin moeglich: Wenn dieselbe Transaktion zweimal denselben Datensatz liest, kann zwischen den beiden Lesevorgaengen eine andere Transaktion den Wert veraendert und committet haben. Auch Phantom-Reads sind moeglich. Dies ist die Standardstufe vieler DBMS wie Oracle und PostgreSQL.
READ COMMITTED verhindert nur Dirty Read. Nonrepeatable Read und Phantom bleiben moeglich.
REPEATABLE READ
Ein einmal gelesener Datensatz bleibt innerhalb derselben Transaktion beim erneuten Lesen unveraendert, d.h. Nonrepeatable Read ist ausgeschlossen. Das Phantomproblem kann jedoch weiterhin auftreten, wenn eine parallele Transaktion Datensaetze einfuegt oder loescht, die ein Selektionspraedikat erfuellen, das sie zuvor nicht erfuellten. REPEATABLE READ ist der Default in MySQL/MariaDB. Der Schutz wird typischerweise ueber Sperren oder Snapshots realisiert.
REPEATABLE READ verhindert Dirty Read und Nonrepeatable Read, aber nicht das Phantomproblem.
SERIALIZABLE
Hoechste Isolationsstufe. Garantiert Serialisierbarkeit: das Ergebnis der parallelen Ausfuehrung entspricht immer dem Ergebnis einer seriellen Ausfuehrung der Transaktionen. Die Transaktion sieht nur Aenderungen, die zu Beginn der Transaktion bereits committet waren, plus die eigenen Aenderungen. Alle vier Probleme (Dirty Read, Nonrepeatable Read, Phantom, Lost Update) werden verhindert. Preis: geringste Parallelitaet und potenziell viele Wartezeiten oder Rollbacks.
SERIALIZABLE verhindert alle Probleme, kostet aber Performance.
Die vier Nebenlaeufigkeitsprobleme
Slide 16 der DBI-Folien listet die vier Probleme im Mehrbenutzerbetrieb: (1) Dirty Read - Abhaengigkeit von nicht freigegebenen Daten, (2) Nonrepeatable Read - inkonsistentes Lesen innerhalb derselben Transaktion, (3) Phantom-Problem - Berechnungen auf unvollstaendigen Daten durch neue Datensaetze, (4) Lost Update - verlorengegangene Aenderungen durch Ueberschreiben. 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 Anwendungsfaellen den Systemdurchsatz erhoehen, z.B. durch hoehere Parallelitaet reiner Lesetransaktionen.
SET TRANSACTION ISOLATION LEVEL steuert die Balance zwischen Konsistenz und Durchsatz.
Uebersichtstabelle 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 fuer die Klausur und wird bei Slide 16/17 direkt abgefragt.
Von unten nach oben wird nacheinander Dirty, dann Nonrepeatable, dann Phantom verboten.
Motivation - Warum ueberhaupt Levels
Volle Serialisierbarkeit ist teuer: viele Sperren, wenig Parallelitaet, potenzielle Deadlocks. In vielen Anwendungen (z.B. Reports, Statistiken, Dashboards) ist ein bisschen Inkonsistenz akzeptabel, wenn dafuer die Performance steigt. Deshalb bietet der SQL-Standard eine Aufweichung der ACID-I-Bedingung an. Die Wahl des Levels ist eine bewusste Abwaegung zwischen Korrektheit und Durchsatz.
Isolation Levels sind ein bewusster Trade-off zwischen Konsistenz und Performance.