2相ロック【ツーフェーズロック】2PL
2相ロックとは?

トランザクションの実行中、必要なデータや資源に対して順次ロックを獲得していく段階を「成長相」と呼ぶ。その後、処理の完了に伴ってロックを順次解放していく段階を「縮退相」と呼ぶ。2相ロックの規則は「一つでもロックを解放したら、すべて解放し終わるまで新たなロックを獲得できない」というものである。成長相と縮退相は一方向にしか移行せず、行き来することはない。
複数のトランザクションがこの規則に従うことで、並行するデータアクセスが直列化され、あるトランザクションの処理途中に別のトランザクションがデータを書き換えてしまうような不整合を防ぐことができる。すべてのトランザクションが2相ロックに従う場合、その実行結果は何らかの直列実行と同等になることが理論的に保証される。この性質を「直列化可能性」(serializability)という。
一方で、複数のトランザクションが互いに相手のロック解放を待ち続ける「デッドロック」(deadlock)が発生する可能性がある。そのため、実際のデータベース管理システム(DBMS)では、デッドロックの検出やタイムアウトによる回避機構と組み合わせて運用されることが多い。
ロックの解放をコミット時にまとめて行う方式を「厳密な2相ロック」(S2PL:Strict 2PL)といい、コミット前に保持したロックを一切手放さないため、未確定の更新結果を他のトランザクションが参照してしまう「ダーティリード」や「カスケードロールバック」を防ぎやすい。多くの商用データベース製品ではS2PLをベースとした実装が採用されている。一方、トランザクション開始時点でロックの獲得をすべてまとめて行う方式を「保守的な2相ロック」(C2PL:Conservative 2PL)といい、デッドロックを原理的に回避できるが、使用する資源を事前に確定しなければならないため実装上の制約が大きい。