Instiq
第4章 · トランザクションと同時実行制御·v1.0.0·更新 2026/7/10·読了目安 約16分

変更要約: 初版

4.5分散トランザクションと2相コミット

この節の要点

複数のデータベースサイトにまたがるトランザクションの原子性を保証する2相コミット(2PC)準備(コミット要求)フェーズコミットフェーズ、その弱点を補う3相コミット(3PC)、そして2PCのブロッキング問題を学び、分散環境で一貫性をどう確保すべきかを判断する力を養います。

在庫データベースと決済データベースが別サーバに分かれているシステムを設計するアーキテクトにとって、「複数サイトにまたがる更新をどう原子的にコミットするか」は、分散システム特有の難問です。単一データベースのCOMMITと異なり、ネットワークの遅延や一部サイトの障害を考慮しなければなりません。この節では、分散トランザクションの一貫性をどう確保すべきか、そして2相コミットが抱える弱点にどう向き合うかを判断する視点を養います。

4.5.12相コミット(2PC)の2つのフェーズ

  • 2相コミット(2PC:Two-Phase Commit)=1つのトランザクションが複数のデータベースサイト(参加者)にまたがる場合に、全サイトが揃って原子的にCOMMITまたはROLLBACKすることを保証するプロトコル。コーディネータ(調整者)が各参加者(Participant)とやり取りし、2つのフェーズで進める。
  • 第1フェーズ(準備フェーズ/コミット要求フェーズ)=コーディネータが全参加者に「コミットできるか」を問い合わせる。各参加者は自身の更新内容をログに書き込んだ上で「準備完了(YES)」または「拒否(NO)」を応答する。第2フェーズ(コミットフェーズ)=全参加者からYESが揃えば、コーディネータは全参加者にCOMMIT命令を送り確定させる。1つでもNOがあれば、または応答がタイムアウトすれば、コーディネータは全参加者にROLLBACK命令を送り取り消す。

4.5.22PCのブロッキング問題と3相コミット

  • ブロッキング問題=第1フェーズで全参加者が「準備完了(YES)」を応答した直後にコーディネータ自身が障害でダウンすると、各参加者は「COMMITすべきかROLLBACKすべきか」の指示を受け取れず、コーディネータが復旧するまで保持しているロックを解放できずに待ち続ける(ブロックする)という2PC最大の弱点。この間、他のトランザクションもそのロックの解放待ちで連鎖的に影響を受け得る。
  • 3相コミット(3PC:Three-Phase Commit)=2PCの準備フェーズとコミットフェーズの間に「プリコミットフェーズ」を挟むことで、コーディネータ障害時にも参加者同士のタイムアウトや状態確認によってブロッキングを回避しやすくするプロトコル。ただし、メッセージ往復が増えレイテンシが増加するうえ、ネットワーク分断(CAP定理が指す分断耐性の議論)が絡む状況では完全にブロッキングを排除できるわけではないため、低遅延を重視する多くの実務システムでは今なお2PCが広く使われる

続きは無料登録で読めます

冒頭を無料で公開中。無料登録でこの節の全文と、第4章以降を含む全参考書・全問題集が読めます。