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