2相コミット(two-phase commit)

複数のデータベースにまたがる処理を、全部やるか全部やめるかに揃える手順。

もう少し詳しい説明

2相コミットは、複数のデータベースにまたがる処理を、全部やるか全部やめるかに揃える手順です。

飲み会の日程を決めるときを思い浮かべてください。

第1相:全員に「できますか」と聞くまだ確定しない返事を集める1つでも「無理」があるか?第2相:全員に結果を伝える全員OKなら確定、そうでなければ取りやめ
飲み会の日程を決めるときと同じ段取りです。いきなり店を予約せず、まず全員に「この日いけますか」と聞く。全員がよければ確定、1人でも無理なら取りやめ。確認と確定を分けるのが要点です。

いきなり店を予約してから「その日いける?」と聞くと、来られない人が出たときに困ります。だから順番を逆にします。まず全員に「この日いけますか」と聞いて回り、全員から「いける」が返ってきて初めて「では確定」と伝える。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