Dirty Read (Schmutziges Lesen)
T2 liest einen von T1 geänderten Wert, bevor T1 endgültig festgeschrieben (commit) hat. Fällt T1 später mit abort/rollback zurück, hat T2 mit einem ungültigen Wert weitergerechnet und ggf. eigene Werte darauf basierend geschrieben. Das Ergebnis ist eine Inkonsistenz, denn der ursprüngliche Dirty-Wert existiert offiziell nie in der Datenbank. Erkennungsmerkmal in einer T1/T2-Tabelle: T2 führt read(A) aus, nachdem T1 write(A) gemacht hat, aber bevor T1 commit oder abort ausgeführt hat.
Dirty Read = Lesen von noch nicht committeten Änderungen einer anderen Transaktion.
Lost Update (Verlorengegangene Änderung)
Zwei Transaktionen lesen denselben Wert, berechnen unabhängig neue Werte und schreiben sie nacheinander zurück. Die spätere Schreiboperation überschreibt die frühere ohne sie zu berücksichtigen, sodass eine der Änderungen verloren geht. Typisches Muster: T1 read(A) - T2 read(A) - T1 write(A) - T2 write(A). Der klassische Ablauf im Skript zeigt A=10, T1 macht x:=x+5 und T2 macht x:=x+1, am Ende steht 11 statt 16, da T1s Änderung überschrieben wird.
Lost Update = Zwei write-Operationen auf demselben Datum, wobei die zweite die erste komplett auslöscht.
Non-Repeatable Read (Nicht-wiederholbares Lesen)
Innerhalb derselben Transaktion T2 wird zweimal dasselbe Objekt gelesen, liefert jedoch unterschiedliche Werte, weil eine andere Transaktion T1 zwischen den beiden Lesevorgängen den Wert geändert und committed hat. Anders als beim Dirty Read ist die Änderung von T1 hier bereits gültig, dennoch bricht die Lesekonsistenz innerhalb von T2. Beispiel: T2 macht zwei SELECT guthaben-Statements, zwischendrin führt T1 ein UPDATE Konten aus. Erkennung: gleiches SELECT in einer Transaktion, unterschiedliche Ergebnisse.
Non-Repeatable Read = Zweimal lesen, zweimal anderer Wert, weil jemand zwischendrin geschrieben hat.
Phantom-Problem (Phantom Read)
T1 führt eine mengenbasierte Abfrage aus, z.B. SELECT COUNT(*) FROM Mitarbeiter. Während T1 noch läuft, fügt T2 mit INSERT einen neuen Datensatz ein und committed. Wenn T1 dann darauf basierend weiterarbeitet (z.B. UPDATE ... SET Gehalt = Gehalt + 10000/X), rechnet T1 mit einer falschen Grundgesamtheit. Das Phantom ist der neue Satz, der plötzlich erscheint (oder verschwindet bei DELETE). Unterschied zum Non-Repeatable Read: hier verändert sich die Menge der Datensätze, nicht der Wert eines einzelnen Satzes.
Phantom = neuer Datensatz erscheint (Insert) oder verschwindet (Delete) zwischen zwei mengenbasierten Zugriffen.
Inconsistent Analysis (Inkonsistente Analyse)
Sammelbegriff für statistische bzw. aggregierende Auswertungen (z.B. Summen, Durchschnitte) einer Transaktion, während eine andere Transaktion nebenläufig Werte auf denselben Daten ändert. Das Ergebnis der Analyse ist verfälscht, obwohl jeder Einzelwert korrekt geschrieben wurde. Im DHBW-Skript unter Beispielszenarien als Statistische Datenbankoperationen genannt: Ergebnisse sind verfälscht, wenn während der Berechnung Daten geändert werden. Kann durch Phantom oder Non-Repeatable Read entstehen.
Inconsistent Analysis = Aggregation liest Teilwerte aus verschiedenen Konsistenzzuständen.
Isolation als ACID-Lösung
Isolation aus ACID besagt, dass jede Transaktion den Eindruck hat, allein auf der Datenbank zu arbeiten. Genau diese Eigenschaft wird durch die vier Anomalien verletzt. SQL definiert vier Isolationslevel: READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ und SERIALIZABLE, die schrittweise mehr Probleme verhindern. SERIALIZABLE verhindert alle vier Anomalien, kostet aber Parallelität.
Isolation ist das I in ACID und der Gegenspieler zu allen Nebenläufigkeitsproblemen.
Zeitachsen-Notation T1/T2
In Klausuraufgaben werden die Probleme in einer zweispaltigen Tabelle mit T1 links und T2 rechts dargestellt, die Zeit läuft von oben nach unten. Typische Operationen: read(A,x) lädt Wert A in Variable x, write(x,A) schreibt Variable x nach A, x:=x+5 rechnet, commit und abort/rollback beenden die Transaktion. Zur Erkennung eines Problems: Sequenz der read/write-Operationen genau nachverfolgen und prüfen, wer wann welchen Wert sieht und schreibt.
read/write auf denselben Daten in verzahnter Reihenfolge - dann Muster gegen die vier Anomalien prüfen.