0Pricing
SQL Interview Prep · Lektion

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 SQL 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 SQL Interview Prep-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der SQL 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 existed

Non-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 COMMITTED aufwärts verhindert.
  • Non-Repeatable Read wird ab REPEATABLE READ aufwärts verhindert.
  • Phantom Read wird durch SERIALIZABLE verhindert (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 SQL Interview Prep-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der SQL 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 SQL 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 SQL Interview Prep zu starten?

Keine Vorkenntnisse erforderlich. SQL 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 SQL Interview Prep-Lektion Code schreiben und ausführen?

Ja. Jede SQL 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

  1. ACID-Eigenschaften erklärt
  2. Die vier Isolationsstufen
  3. Dirty Reads, Non-Repeatable Reads und Phantom Reads
  4. Deadlocks, Sperren und MVCC
← Zurück zu SQL Interview Prep