Repeatable Read („wiederholbares Lesen") ist eine SQL-Isolationsebene zwischen Read Committed und Serializable. Sie verhindert zusätzlich die Non-Repeatable-Read-Anomalie: Dieselbe Abfrage liefert innerhalb einer Transaktion immer dasselbe Ergebnis.

Transaktions-Snapshot statt Statement-Snapshot

Während Read Committed nur pro Anweisung einen frischen Stand sieht, arbeitet Repeatable Read auf einem festen Snapshot vom Transaktionsstart (MVCC). Dirty Reads und Non-Repeatable Reads sind damit ausgeschlossen — eine Zeile, die beim ersten SELECT einen Wert hatte, behält diesen Wert in der gesamten Transaktion.

Phantomprobleme: Standard und InnoDB

  • SQL-Standard: Phantom Reads (neue Zeilen, die nachträglich in eine Ergebnismenge hineinwachsen) sind bei Repeatable Read laut SQL-92 erlaubt.
  • MySQL InnoDB: Die Standardeinstellung ist REPEATABLE READ. InnoDB verhindert Phantome bei Sperr-Lesevorgängen (etwa SELECT … FOR UPDATE) zusätzlich durch Gap Locks und Next-Key Locks — eine MySQL-spezifische Erweiterung über den ANSI-Standard hinaus. Dafür steigt die Sperrkonkurrenz; ein Deadlock wird wahrscheinlicher.
  • PostgreSQL: Repeatable Read ist ein MVCC-Snapshot ohne Gap Locks. Neue, von anderen Transaktionen committete Zeilen sind im festen Snapshot unsichtbar — Phantome treten praktisch nicht auf. Möglich bleibt aber die Write-Skew-Anomalie: Zwei Transaktionen lesen überlappende Daten und schreiben disjunkte Zeilen, wodurch eine gemeinsame Invariante verletzt werden kann.

Einordnung

Repeatable Read ist die Standardwahl für Systeme wie MySQL InnoDB, die konsistente Sichten ohne Serialisierungskosten brauchen. Wer die volle Garantie wünscht, wählt Serializable (in PostgreSQL als SSI umgesetzt); die MVCC-Technik dahinter entspricht der Snapshot Isolation. Grundlagen liefern Transaktion und ACID. Als striktestes Einzelobjekt-Modell markiert die Linearisierbarkeit das obere Ende des Konsistenzspektrums.