2相コミット(two-phase commit)
- テクノロジ系
- データベース
- 応用情報
- 重要度 ★★★☆☆
複数のデータベースにまたがる処理を、全部やるか全部やめるかに揃える手順。
もう少し詳しい説明
2相コミットは、複数のデータベースにまたがる処理を、全部やるか全部やめるかに揃える手順です。
飲み会の日程を決めるときを思い浮かべてください。
いきなり店を予約してから「その日いける?」と聞くと、来られない人が出たときに困ります。だから順番を逆にします。まず全員に「この日いけますか」と聞いて回り、全員から「いける」が返ってきて初めて「では確定」と伝える。1人でも無理なら「今回は取りやめ」と全員に伝えます。
データベースが複数に分かれている場合も、まったく同じ段取りを踏みます。
2つの相
登場人物は、取りまとめる調整役(コーディネータ)と、各データベース側の参加者です。
第1相:コミットできるかを聞く 調整役が各参加者に「更新を確定できますか」と問い合わせます。参加者は自分の側で準備を整え、「できます」または「できません」と返します。
ここでまだ確定はしません。「できます」と答えた参加者は、確定にも取消しにも進める状態を保ったまま待ちます。
第2相:結果を伝える 調整役が返事を集計します。全員が「できます」なら全員に確定を指示し、1つでも「できません」があれば全員に取消しを指示します。
第1相は確認、第2相は確定。 この2つを取り違えないことが、この用語のすべてです。
なぜ2段階に分けるのか
もし各データベースが勝手に確定してしまうと、片方だけ確定した状態が作れてしまいます。これは2相コミットが防ごうとしていることそのものです。
だから、確認と確定を分けて、全員の返事がそろうまで誰も確定させません。
弱点:待ち続けてしまう
この方式には弱点があります。
「できます」と返事をした後で、調整役と連絡が取れなくなったらどうなるでしょうか。参加者は自分だけでは判断できません。確定してよいのか取り消すべきなのか分からないまま、資源を押さえて待ち続けることになります。これをブロッキングと呼びます。
待っているあいだ、その資源は他の処理から使えません。この問題を軽くするために、確定を伝える段階をさらに分けた3相コミットという方式も考えられています。
試験ではこう出る
応用情報のデータベース分野で、分散データベースの整合性を保つ方式として出ます。多いのは、第1相と第2相でそれぞれ何をするかを問う形です。基本情報での出題は多くありませんが、応用情報では確実に押さえておきたい用語です。「第1相は確認、第2相は確定」と覚えて、この2つを取り違えないことがすべてです。 応用情報では、調整役に障害が起きたときに参加者がどうなるか(ブロッキング)を問う問題も出ます。
関連する用語
- トランザクション
- これ以上分けられない処理のまとまり
- ACID特性
- 処理が守るべき4つの約束。原子性・一貫性・独立性・耐久性
- 3相コミット
- 確定を伝える段階をさらに分け、待ち続ける問題を軽くした方式
- デッドロック
- 鍵を取り合った結果、互いに待ち合って動けなくなる状態
ミニクイズ
分散データベースにおける2相コミットの第1相(第1フェーズ)で行われることとして、最も適切なものはどれか。
正解は 4番:調整役が各データベースにコミットできるかを問い合わせ、可否の返答を受け取る
第1相は確認だけで、まだ確定はしません。全員から「できます」が返ってきて初めて、第2相で確定を指示します。1つでも「できません」があれば、第2相では全員に取消しを指示します。コミットを指示するのは第2相の内容で、これを第1相と取り違えるのが最も多い間違いです。各データベースが勝手にコミットしてしまうと、片方だけ確定した状態を作れてしまい、この方式の目的そのものが失われます。
最終更新:2026-09-14