introtext

Ein Phantom Read ist eine Anomalie bei wiederholten Bereichsabfragen: Eine Transaktion führt dieselbe Abfrage mit einem WHERE-Prädikat zweimal aus und erhält unterschiedliche Zeilensätze, weil eine andere Transaktion dazwischen Zeilen eingefügt oder gelöscht hat, die in das Prädikat passen. Die neu eingefügte Zeile ist das „Phantom": Sie taucht wie ein Geist auf und verschwindet wieder.

Beispiel

Transaktion A zählt alle Bücher mit Bestand kleiner 10 (SELECT COUNT(*) FROM buecher WHERE bestand < 10) und erhält 3. Transaktion B fügt dazwischen ein neues Buch mit Bestand 5 ein und committet. Die zweite Zählung von A liefert 4 — obwohl A in einer abgeschlossenen Transaktion arbeitet. Entscheidungen auf Basis der ersten Zählung (etwa eine Nachbestellung) beruhen damit auf einer veralteten Ergebnismenge.

Abgrenzung zum Non-Repeatable Read

Beim Non-Repeatable Read ändert sich der Wert einer bereits gelesenen Zeile; beim Phantom Read ändert sich die Menge der Zeilen, die auf ein Prädikat passen. Das Phantom-Problem betrifft deshalb nur Bereichsabfragen und nicht das erneute Lesen einzelner Zeilen.

Wann tritt es auf?

Laut ANSI SQL-92 erlaubt Repeatable Read Phantom Reads; erst Serializable verbietet sie. Die Praxis ist vielfältiger:

  • MySQL InnoDB verhindert Phantom Reads bereits bei Repeatable Read — die Standardebene des Systems — per Gap-Locks und Next-Key-Locks (Bereichssperren zwischen Indexwerten).
  • PostgreSQL Repeatable Read (MVCC mit festem Transaktions-Snapshot wie bei Snapshot Isolation) zeigt neu committete Zeilen gar nicht erst an; Serializable wird dort als SSI (Serializable Snapshot Isolation) umgesetzt.
  • Reine Sperr-Systeme verhindern Phantoms bei Serializable durch Prädikats- beziehungsweise Bereichssperren innerhalb des Two-Phase Locking.

Warum Phantoms tückisch sind

Phantom Reads tragen zum Write Skew bei: Eine Auswahl-Abfrage liefert eine Menge von Zeilen, und eine spätere Transaktion ändert davon disjunkte Teile — der gemeinsame Invarianten-Schutz greift nicht. In der SIGMOD-1995-Kritik von Berenson und Kollegen ist der Phantom Read die Anomalie P3 beziehungsweise A3; ihre Analyse zeigt zudem, dass die ANSI-Definitionen mehrdeutig sind und auch Snapshot Isolation Phantom-ähnliche Effekte zulassen kann.

Verwandte Grundlagen: Isolationsebene, Dirty Read, Repeatable Read, Serializable, Write Skew, Deadlock.