Dirty Reads, Non-Repeatable Reads und Phantom Reads
Die drei Anomalien beim Lesen und welche Isolationsstufe jeweils Abhilfe schafft.
Dirty Reads, Non-Repeatable Reads und Phantom Reads ist eine kostenlose Coding Interview Prep-Lektion auf CoddyKit. Dies ist Lektion 3 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Coding Interview Prep-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Coding Interview Prep-Kurs umfasst insgesamt 4 Lektionen.
Die drei Leseanomalien
Isolationsstufen dienen dazu, bestimmte Nebenläufigkeitsfehler zu verhindern, die als Leseanomalien bezeichnet werden. In Vorstellungsgesprächen wird erwartet, dass Sie alle drei präzise definieren und jeder Anomalie die Stufe zuordnen, die sie verhindert.
- Dirty Read – Lesen nicht festgeschriebener Daten
- Non-Repeatable Read – eine Zeile ändert sich zwischen zwei Lesevorgängen
- Phantom Read – neue Zeilen erscheinen zwischen zwei Lesevorgängen
Der Knackpunkt ist die Unterscheidung zwischen Non-Repeatable Read und Phantom Read, da beide eine erneute Abfrage mit unterschiedlichen Ergebnissen beinhalten.
Dirty Read: Definition
Ein Dirty Read tritt auf, wenn Transaktion T1 eine Zeile liest, die Transaktion T2 geändert, aber noch nicht festgeschrieben hat. Rollt T2 anschließend zurück, hat T1 auf Daten reagiert, die nie wirklich existiert haben.
Nur READ UNCOMMITTED erlaubt Dirty Reads. Jede höhere Stufe verbietet sie.
Gefahr in der Praxis: einen Kredit auf Grundlage einer Einzahlung genehmigen, die wenige Sekunden später zurückgerollt wird.
Dirty Read: Zeitablauf
Lesen Sie die beiden Spalten als Zeitablauf. T1 läuft auf READ UNCOMMITTED.
T1 sieht einen Kontostand von 700, aber T2 führt nie einen Commit aus. Die 700 waren ein Phantom der laufenden Arbeit von T2. Nach dem Zurückrollen von T2 beträgt der tatsächliche Wert weiterhin 500. T1 hat eine Entscheidung auf Grundlage unbrauchbarer Daten getroffen.
-- T2 (not committed) | -- T1 (READ UNCOMMITTED)
BEGIN; |
UPDATE accounts |
SET balance = 700 |
WHERE id = 1; |
| SELECT balance FROM accounts
| WHERE id = 1; -- reads 700 (dirty!)
ROLLBACK; |
| -- T1 acted on a value that never existedNon-Repeatable Read: Definition
Ein Non-Repeatable Read tritt auf, wenn T1 eine Zeile liest, T2 ein Update oder eine Löschung an derselben Zeile festschreibt und T1 sie erneut liest und einen anderen Wert sieht.
Beachten Sie den entscheidenden Unterschied zu einem Dirty Read: Hier hat T2 die Änderung festgeschrieben. Die Daten sind real, aber sie haben sich innerhalb einer einzigen Transaktion unter T1 verändert.
READ COMMITTED erlaubt dies weiterhin. REPEATABLE READ und höhere Stufen verhindern dies, indem sie aus einem stabilen Snapshot lesen.
Non-Repeatable Read: Zeitablauf
T1 läuft auf READ COMMITTED und liest dieselbe Zeile zweimal. Zwischen den beiden Lesevorgängen schreibt T2 eine Änderung fest.
Innerhalb einer Transaktion liefert derselbe Primärschlüssel zwei unterschiedliche Werte. Diese Inkonsistenz kann mehrstufige Logik beeinträchtigen, die davon ausgeht, dass die Zeile unverändert bleibt.
-- T1 (READ COMMITTED) | -- T2
BEGIN; |
SELECT balance FROM accounts |
WHERE id = 1; -- 500 |
| BEGIN;
| UPDATE accounts SET balance = 900
| WHERE id = 1;
| COMMIT;
SELECT balance FROM accounts |
WHERE id = 1; -- 900 (changed!) |
COMMIT; |Phantom Read: Definition
Ein Phantom Read tritt auf, wenn T1 eine Abfrage mit einer Suchbedingung ausführt, T2 ein INSERT (oder DELETE) von Zeilen festschreibt, die dieser Bedingung entsprechen, und T1 die Abfrage erneut ausführt und eine andere Menge von Zeilen sieht.
Der Unterschied zu einem Non-Repeatable Read: Bei einem Non-Repeatable Read geht es darum, dass sich der Wert einer vorhandenen Zeile ändert; bei einem Phantom Read geht es darum, dass sich die Anzahl der Zeilen, die einem Prädikat entsprechen, ändert.
Nur SERIALIZABLE verhindert Phantoms gemäß der Garantie des Standards.
Phantom Read: Zeitablauf
T1 zählt hochwertige Konten zweimal. Zwischen den beiden Zählungen fügt T2 eine neue passende Zeile ein und schreibt sie fest.
Keine vorhandene Zeile hat sich geändert, trotzdem unterscheiden sich die COUNT-Ergebnisse. Die neue Zeile ist das „Phantom“, das in T1s Ergebnismenge erschienen ist.
-- T1 (REPEATABLE READ, standard) | -- T2
BEGIN; |
SELECT COUNT(*) FROM accounts |
WHERE balance > 1000; -- 3 |
| INSERT INTO accounts(id, balance)
| VALUES (99, 5000);
| COMMIT;
SELECT COUNT(*) FROM accounts |
WHERE balance > 1000; -- 4 (phantom)|
COMMIT; |Zuordnung von Anomalien zu Isolationsstufen
Diese Zuordnung bildet den Kern des Themas. Die niedrigste Stufe, die die jeweilige Anomalie verhindert:
- Dirty Read wird ab
READ COMMITTEDaufwärts verhindert. - Non-Repeatable Read wird ab
REPEATABLE READaufwärts verhindert. - Phantom Read wird durch
SERIALIZABLEverhindert (gemäß dem Standard).
Beachten Sie, dass die Namen zusammenpassen: REPEATABLE READ macht Lesevorgänge wiederholbar; die Stufen sind nach der Anomalie benannt, die sie jeweils zusätzlich beheben.
Non-Repeatable Read vs. Phantom Read: Die klare Abgrenzung
Das ist die häufigste Verwechslung in Vorstellungsgesprächen. Merken Sie sich diesen einen Satz:
Non-Repeatable Read = Der Wert einer vorhandenen Zeile hat sich geändert. Phantom Read = Die Menge der passenden Zeilen hat sich geändert (Zeilen wurden hinzugefügt oder entfernt).
Testen Sie sich selbst: T2 führt UPDATE ... WHERE id = 5 aus und committet, und T1 liest Zeile 5 erneut. Das ist ein Non-Repeatable Read. T2 führt ein INSERT für eine neue Zeile aus, die auf die WHERE-Bedingung von T1 passt, und T1 führt die Abfrage erneut aus. Das ist ein Phantom Read.
Write Skew: Die zusätzliche Anomalie
In Senior-Interviews geht es möglicherweise über die drei Standardanomalien hinaus und um Write Skew: Zwei Transaktionen lesen jeweils eine sich überschneidende Menge, führen auf Grundlage ihrer Leseergebnisse voneinander unabhängige Schreibvorgänge aus und committen beide. Dadurch entsteht ein Zustand, den keine von ihnen allein zugelassen hätte.
Ein klassisches Beispiel: Zwei Ärzte haben Bereitschaft; jeder prüft, dass ein anderer Arzt Bereitschaft hat, und nimmt sich dann selbst aus dem Dienst. Beide Vorgänge sind erfolgreich, sodass niemand mehr in Bereitschaft ist.
Snapshot isolation (Postgres REPEATABLE READ) erlaubt Write Skew; nur SERIALIZABLE verhindert ihn. Das zu erwähnen, signalisiert fachliche Tiefe.
Lost Update: Die vierte Falle
Interviewer bauen manchmal den Lost Update ein, der nicht in der Anomalieliste des Standards enthalten ist, aber in der Praxis ständig vorkommt. Zwei Transaktionen lesen denselben Wert, berechnen daraus jeweils einen neuen Wert und schreiben ihn zurück. Der zweite Schreibvorgang überschreibt den ersten stillschweigend.
Beispiel: Zwei Überweisungen lesen jeweils einen Kontostand von 500, ziehen jeweils einen Betrag ab und schreiben jeweils ihr Ergebnis zurück. Eine der Abbuchungen geht verloren.
Die Lösung ist nicht nur eine höhere Isolationsstufe, sondern eine explizite Sperre mit SELECT ... FOR UPDATE oder ein atomares Update, das die Berechnung in der Datenbank statt in der Anwendung ausführt.
-- Safe pattern: lock the row, or compute atomically
BEGIN;
SELECT balance FROM accounts WHERE id = 1 FOR UPDATE; -- locks row
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
COMMIT;
-- Or simply: UPDATE accounts SET balance = balance - 100 WHERE id = 1;Kurze Überprüfung
Ordnen Sie anhand des Verhaltens die Anomalie zu.
Zusammenfassung: Anomalien und ihre Lösungen
Drei Leseanomalien, die jeweils durch eine höhere Isolationsstufe behoben werden:
- Dirty Read (nicht festgeschriebene Daten) – behoben ab READ COMMITTED.
- Non-Repeatable Read (der Wert einer vorhandenen Zeile ändert sich) – behoben ab REPEATABLE READ.
- Phantom Read (die Menge der passenden Zeilen ändert sich) – behoben ab SERIALIZABLE.
Behalten Sie die klare Abgrenzung zwischen Non-Repeatable Read und Phantom Read bei und erwähnen Sie Write Skew, wenn der Interviewer weitere Details hören möchte. Als Nächstes sehen wir uns an, wie Engines Isolation tatsächlich durchsetzen: Sperren, Deadlocks und MVCC.
Häufig gestellte Fragen
Ist die Lektion „Dirty Reads, Non-Repeatable Reads und Phantom Reads“ kostenlos?
Ja — der vollständige Text von „Dirty Reads, Non-Repeatable Reads und Phantom Reads“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Coding Interview Prep-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Coding Interview Prep-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Dirty Reads, Non-Repeatable Reads und Phantom Reads“?
Die drei Anomalien beim Lesen und welche Isolationsstufe jeweils Abhilfe schafft. Du übst Coding Interview Prep mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um Coding Interview Prep zu starten?
Keine Vorkenntnisse erforderlich. Coding Interview Prep auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 3 von 4.
Wie lange dauert die Lektion „Dirty Reads, Non-Repeatable Reads und Phantom Reads“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser Coding Interview Prep-Lektion Code schreiben und ausführen?
Ja. Jede Coding Interview Prep-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- ACID-Eigenschaften erklärt
- Die vier Isolationsstufen
- Dirty Reads, Non-Repeatable Reads und Phantom Reads
- Deadlocks, Sperren und MVCC