Two-Phase Locking (2PL) ist das klassische Sperrprotokoll für Datenbanktransaktionen: Jede Transaktion erwirbt und gibt Sperren in zwei klar getrennten Phasen ab. Werden die Regeln des 2PL eingehalten, ist der Ablauf der Transaktionen garantiert serialisierbar — die höchste Stufe der SQL-Isolationsebenen.

Die zwei Phasen

Das Protokoll zerlegt jede Transaktion in einen Zeitstrahl mit zwei Abschnitten:

  • Wachsende Phase (Growing Phase): Die Transaktion darf Sperren erwerben, aber keine freigeben. Sie sammelt nach und nach alle Sperren, die sie für ihre Lese- und Schreiboperationen braucht.
  • Schrumpfende Phase (Shrinking Phase): Die Transaktion darf Sperren freigeben, aber keine neuen erwerben. Ab der ersten Freigabe ist der Sperrbestand nur noch abbaubar.

Der Name kommt daher, dass der Sperrbestand der Transaktion erst wächst und dann schrumpft — es gibt keinen Zeitpunkt, an dem eine Transaktion eine Sperre freigibt und später eine neue anfordert.

Warum das Serialisierbarkeit garantiert

Verzahnen sich zwei Transaktionen nach 2PL-Regeln, entsteht nie ein Zyklus im Abhängigkeitsgraphen der Sperren — genau solche Zyklen sind die Ursache von Nicht-Serialisierbarkeit. Deshalb ist jeder Schedule, den 2PL erzeugt, konflikt-serialisierbar: Das Ergebnis entspricht einer seriellen Ausführung der Transaktionen. Formal beschrieben haben das C. P. Eswaran, J. N. Gray, R. A. Lorie und I. L. Traiger in The Notions of Consistency and Predicate Locks in a Database System (Communications of the ACM, 19(11), 1976, IBM Research San Jose).

Varianten: Basic 2PL, Strict 2PL, Rigorous 2PL

  • Basic 2PL: Die Grundform. Sie kann kaskadierende Rollbacks auslösen: Gibt eine Transaktion eine Schreibsperre vor ihrem Commit frei und bricht später ab, müssen alle nachfolgenden Transaktionen, die den Wert gelesen haben, ebenfalls zurückgerollt werden.
  • Strict 2PL (S2PL): Schreibsperren werden erst beim Commit oder Abbruch freigegeben. Das verhindert kaskadierende Rollbacks und ist die praktisch verwendete Variante in Datenbanksystemen.
  • Rigorous 2PL: Alle Sperren (auch Lese-Sperren) bleiben bis zum Ende der Transaktion gehalten — strikteste Form, Basis vieler Implementierungen von Serializable.

Praxis: Wo 2PL steckt

Bei Serializable setzen klassische Datenbanksysteme auf 2PL mit Spezial-Sperren: MySQL InnoDB verwendet gemeinsame Lese-Sperren plus Next-Key-Locks, SQL Server Key-Range-Locks, um auch Repeatable Read-Lücken (Phantome) zu schließen. Der Preis ist das Risiko eines Deadlock: Je länger Sperren gehalten werden, desto eher blockieren sich Transaktionen gegenseitig.

Der klassische Gegenentwurf ist MVCC: Statt zu sperren, verwaltet das System mehrere Versionen einer Zeile, sodass Leser und Schreiber sich nicht blockieren. 2PL ist ein pessimistisches Verfahren (Konflikte werden im Voraus verhindert), MVCC ein optimistischeres (Konflikte werden beim Commit entschieden).

Verwandte Grundlagen: Transaktion, ACID, Read Committed, Linearisierbarkeit.