3相コミットプロトコル (3PC) とは
3相コミットプロトコル(Three-Phase Commit Protocol, 3PC)は、
コンピュータネットワークや
データベースにおける
分散アルゴリズムの一つです。
分散システム内の全てのノードが、
データベーストランザクションのコミット(確定)について合意形成を図ることを目的としています。
2相コミット(Two-Phase Commit, 2PC)と比較して、3PCはノンブロッキングという重要な特性を持ちます。これは、
トランザクションがコミットされるか中止されるかのいずれかの決定が、一定時間内に必ず行われることを意味します。具体的には、
トランザクションが3PCによってコミットを試みている際に、あるリソースをロックしている場合、タイムアウトが発生すればそのロックは必ず解除されることが保証されます。
プロトコルの詳細
3PCのプロトコルは、2PCと類似した用語を使用し説明されます。ここでは、
トランザクションを制御する「調整者(coordinator)」と、調整者の指示に従う一つまたは複数の「参加者(cohorts)」が存在します。
調整者の役割
1.
トランザクションリクエストの受信: 調整者は
トランザクションリクエストを受け取ります。もしこの時点で調整者に障害が発生した場合、
トランザクションは中止されます(回復後も中止とみなされます)。
2.
`canCommit?` メッセージの送信: 障害が発生しなかった場合、調整者は全ての参加者に`canCommit?`メッセージを送信し、待機状態へと移行します。
3.
待機状態での処理: 待機状態中に調整者に障害やタイムアウトが発生した場合、または参加者から`No`メッセージを受信した場合、調整者は
トランザクションを中止し、全ての参加者へ中止メッセージを送信します。
4.
`preCommit` メッセージの送信: 全ての参加者から制限時間内に`Yes`メッセージを受信した場合、調整者は全ての参加者へ`preCommit`メッセージを送信し、準備状態へと移行します。
5.
コミット状態への移行: 調整者は準備状態が成功すれば、コミット状態へと移行します。ただし、参加者からの了解メッセージを待機中にタイムアウトが発生した場合、
トランザクションを中止します。全ての了解メッセージを受信した場合もコミット状態へと移行します。
参加者の役割
1.
`canCommit?` メッセージの受信: 参加者は調整者から`canCommit?`メッセージを受信します。
2.
`Yes` メッセージの送信: メッセージに合意する場合、`Yes`メッセージを調整者に送信し、準備状態へと移行します。
3.
準備状態での処理: 準備状態において、調整者から中止メッセージを受信した場合、または障害が発生するか、コミットを待機中にタイムアウトが発生した場合、参加者は
トランザクションを中止します。
4.
コミットの実行: 参加者が`preCommit`メッセージを受信した場合、`ACK`メッセージを送信し、
トランザクションをコミットします。
問題点
3PCの主な問題点は、ネットワークが分断(セグメント化)された場合に回復が困難になる点です。初期の3PCアルゴリズムは、フェイルストップモデルを前提としており、プロセスがクラッシュによって障害が発生し、そのクラッシュが正確に検出可能である場合に適用できます。しかし、ネットワークパーティションや非同期通信においては、この前提が成り立たないため、3PCの適用は困難となります。
まとめ
3相コミットプロトコルは、分散環境における
トランザクションの整合性を確保するための重要なアルゴリズムですが、ネットワーク環境や障害モデルによっては適用が難しい場合があります。そのため、実際のシステム設計においては、ネットワーク環境や要件を考慮した上で、適切な分散
トランザクションプロトコルを選択することが重要です。
関連項目
2相コミット
Paxos commit
参考資料
Gaddam, Srinivas R. (1995年4月29日). "Three-Phase Commit Protocol". 2008年3月11日閲覧。
Paxosアルゴリズムに基づいたフォールトトレラントなコミットアルゴリズム