2相・3相コミットメント制御とは?分散トランザクションの仕組みを徹底解説
2相コミットメント制御(Two-Phase Commit:2PC)と3相コミットメント制御(Three-Phase Commit:3PC)は、分散データベースや分散システムにおいて、複数ノードにまたがるトランザクションを安全に確定させるための代表的な制御方式です。情報処理技術者試験でも頻出であり、両者の違いを正しく理解することが重要です。
分散トランザクションとコミット制御の必要性
分散トランザクションとは、複数のサーバやデータベースノードにまたがって処理されるトランザクションを指します。このような環境では、全ノードが成功した場合のみコミットし、一部でも失敗すればロールバックするという一貫性の確保が不可欠です。
この調整役を担うのがコミットメント制御であり、代表的な方式が2相・3相コミットメント制御です。
2相コミットメント制御(2PC)の概要
2相コミットメント制御は、その名の通り2つのフェーズでトランザクションの確定を行う方式です。コーディネータ(調整役)と複数の参加ノードで構成されます。
第1相:投票フェーズ(Prepare)
コーディネータは各参加ノードに対して「コミット可能か」を問い合わせます。各ノードは、処理が正常に完了できる場合はYES、問題がある場合はNOを返します。
第2相:決定フェーズ(Commit/Abort)
全ノードがYESを返した場合、コーディネータはコミット命令を送信します。1つでもNOがあれば、ロールバック命令を送信し、トランザクションは中止されます。
2相コミットメント制御の問題点
2PCの最大の欠点は、コーディネータ障害によるブロッキング問題です。第1相終了後、第2相に進む前にコーディネータが故障すると、参加ノードは判断不能な待機状態に陥ります。
この状態ではリソースが解放されず、システム全体の可用性が低下します。
3相コミットメント制御(3PC)の概要
3相コミットメント制御は、2相コミットに中間フェーズを追加することで、ブロッキング問題を緩和した方式です。処理は以下の3段階で進行します。
- 第1相:問い合わせフェーズ(CanCommit)
- 第2相:準備完了フェーズ(PreCommit)
- 第3相:確定フェーズ(DoCommit)
3相コミットメント制御の特徴
第2相の準備完了フェーズでは、「次に進めば必ずコミットする」ことを全ノードで共有します。これにより、コーディネータ障害が発生しても、参加ノードが一定の条件下で自律的に判断できるようになります。
2相と3相コミットメント制御の比較
| 項目 | 2相コミット | 3相コミット |
|---|---|---|
| フェーズ数 | 2 | 3 |
| ブロッキング問題 | 発生しやすい | 発生しにくい |
| 通信回数 | 少ない | 多い |
| 処理の複雑さ | 比較的単純 | 複雑 |
実用面での使い分け
実際のシステムでは、実装の簡潔さから2相コミットメント制御が多く利用されています。一方で、高可用性が求められる環境では、3相コミットの考え方を応用した方式が検討されることもあります。
情報処理技術者試験でのポイント
試験では「ブロッキング問題を緩和する方式はどれか」「2相と3相の違いは何か」といった形で出題されます。2相=シンプルだがブロッキングあり、3相=複雑だが可用性向上と整理して覚えると効果的です。
まとめ
2相・3相コミットメント制御は、分散トランザクションにおける整合性と可用性を支える重要な技術です。それぞれの特徴と課題を理解することで、分散データベースやシステム設計の理解がより深まります。
(キーワード:2相コミットメント制御、3相コミットメント制御、分散トランザクション、ブロッキング問題、データベース)
コメント