本文へスキップ

二相コミットとは?

にそうこみっと

二相コミットとは、分散システムで複数のノードが参加するトランザクションをすべて成功させるかすべて失敗させるかを一貫して保証するためのプロトコルです。

二相コミット(2-Phase Commit:2PC)とは、分散データベースや分散システムにおいて、複数サーバー(参加者)にまたがるトランザクションの原子性(Atomicity)を保証するためのコンセンサスプロトコルです。すべての参加者が処理を完了できる場合のみコミット(確定)し、一つでも失敗があれば全体をロールバック(取り消し)することで、分散環境でのデータ整合性を維持します。

二相コミットは以下の2つのフェーズで構成されます。

第1フェーズ(準備フェーズ / Prepare Phase)
コーディネーター(調整役)が全参加者に「コミットできるか?」と問い合わせます。各参加者はトランザクションを実行可能かを確認し、可能なら「Yes」、不可能なら「No」をコーディネーターに返答します。

第2フェーズ(コミット/ロールバックフェーズ)
全参加者がYesを返した場合、コーディネーターはコミット指示を送り、全参加者が変更を確定します。一つでもNoがあれば、コーディネーターはロールバック指示を全員に送ります。

二相コミットにはいくつかの課題もあります。

  • コーディネーターが障害を起こすと参加者がロック状態(ブロッキング)になる
  • ネットワーク遅延が大きい環境では性能低下が生じる
  • 完全な障害耐性がない(三相コミット等で改善が試みられている)

マイクロサービスアーキテクチャや分散データベースにおいて、強い一貫性が求められる場合に利用されますが、SagaパターンなどのEVENTUAL CONSISTENCYアプローチと使い分けられることも多いです。

使い方・例文

ECサイトで「在庫DB」と「注文DB」が別々のサーバーにある場合に、どちらか一方だけが更新されて不整合が起きないよう、二相コミットを使って両方のDBへの書き込みをアトミックに確定させる場面で登場します。

この用語をシェア

𝕏 でポスト LINE

最終更新:

関連用語