【にふぇーずこみっと】

2フェーズコミット とは?

最終更新:
💡 準備をそろえ、決定に従って確定する

複数のトランザクション資源にまたがる変更を、まとめて確定するか取り消すかにそろえる手順。まず確定できる状態を準備し、次に調整役の決定に従って確定または取り消しを行う。

📌 このページのポイント
2フェーズコミット:二段階で決める① 準備できるか確認調整役DB ADB B準備を依頼可否を返す② 結果を決めて知らせる調整役DB ADB B確定を通知準備できなければ、取り消す判断へ準備完了は、まだ確定完了ではない
複数の参加者を同じ結果へ揃える手順。同じ時刻に確定する意味ではありません。
ひよこ ひよこ
2フェーズコミットは、何をそろえるの?
ペンギン先生 ペンギン先生
複数のDBなどにまたがる変更を、全体として確定するか取り消すかにそろえるよ。各参加者が、その手順に対応していることが前提だね。単に二つのサービスへリクエストを順番に送るだけでは、2フェーズコミットにはならないんだ。
ひよこ ひよこ
最初の準備では、何をするの?
ペンギン先生 ペンギン先生
調整役が、参加者に確定できる準備を求めるよ。準備した側は、あとで決定に従える状態を保つ。PostgreSQLならPREPARE TRANSACTIONで準備するけれど、この時点はまだコミットではない。失敗後に決定を実行できるよう、状態も保持するんだ。
ひよこ ひよこ
一つでも準備できなければ?
ペンギン先生 ペンギン先生
全体を確定せず、取り消す決定にするよ。必要な準備がそろえば確定を決め、その決定を伝える。ただし参加者が同じ時計の瞬間に一斉に確定する、という意味ではない。通信や復旧を通じて、同じ決定へそろえることが大切なんだ。
ひよこ ひよこ
調整役との通信が切れたら?
ペンギン先生 ペンギン先生
準備済みの参加者が、決定を分からず待つ場合があるよ。その間はロックなどを保持し、ほかの処理に影響することもある。タイムアウトしたから独断で取り消せばよいとは限らない。決定の記録、復旧、未解決の取引を確認する仕組みも必要だね。
ひよこ ひよこ
自分のアプリから、準備コマンドを直接呼べばいい?
ペンギン先生 ペンギン先生
PostgreSQLは、外部のトランザクション管理システムで使う機能として説明しているよ。参加者の対応、障害からの復旧、準備状態の監視まで含めて選ぼう。マイクロサービスなら必ず使えない、とも、どんなAPIでも安全にまとめられる、とも決めないんだ。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「2フェーズコミット」って出てきたら「準備をそろえてから、みんなの確定・取り消しを決める手順」と思えばだいたいOK!
📖 おまけ:英語の意味
「Two-Phase Commit」 = 2段階確定
💬 文字通り2つの段階(Phase)を経てコミットするから2フェーズコミットだよ。略して2PCとも呼ばれるよ

参考資料

← 用語集にもどる