二相ロック
古典的な並行性制御アルゴリズム。トランザクションは触れたオブジェクトをロックし、コミット時にまとめて解放する。「二相」とは、ロックを取る拡張フェーズと、手放す縮小フェーズのこと。直列化可能性を保証するが、デッドロックの危険がある。
厳格2PL(S2PL)は排他ロックを最後まで保持して回復可能性を保証する。Rigorous 2PL はすべてのロックを最後まで保持する。MySQL InnoDB は Serializable 分離レベルで S2PL を使う。対抗するのは MVCC とスナップショット分離(Postgres の既定)で、書き込みだけをロックし、読み取りはブロックされずに一貫したスナップショットを見る。2PL はロック競合が多いが、理屈は単純である。現代の分散 DB は楽観的並行性制御(Cockroach)や MVCC(Postgres、Spanner)を使う。DB の授業では必ず習う古典だ。