
トランザクション処理、データベース、およびコンピュータネットワークにおいて、2 相コミット プロトコル( 2PC、tupac ) は、アトミック コミットメント プロトコル(ACP)の一種です。これは、分散アトミック トランザクションに参加するすべてのプロセスが、トランザクションをコミットするか中止 (ロールバック) するかを調整する分散アルゴリズムです。このプロトコル (特殊なタイプの合意プロトコル) は、一時的なシステム障害 (プロセス、ネットワーク ノード、通信などの障害を含む) の多くの場合でも目的を達成できるため、広く使用されています。[ 1 ] [ 2 ] [ 3 ] ただし、考えられるすべての障害構成に対して耐性があるわけではなく、まれに、結果を修復するために手動による介入が必要になる場合があります。障害からの回復 (ほとんどの場合は自動) に対応するために、プロトコルの参加者はプロトコルの状態のログ記録を使用します。ログ レコードは通常生成に時間がかかりますが、障害後も保持され、プロトコルの回復手順で使用されます。ログ記録戦略と回復メカニズムが主に異なる多くのプロトコル バリアントが存在します。通常は使用頻度が低いことを想定しているものの、復旧手順は、プロトコルで考慮しサポートする必要のある多くの障害シナリオが存在するため、プロトコルのかなりの部分を占めている。
単一の分散トランザクションの「通常の実行」 (つまり、障害が発生しない場合。これは通常最も頻繁に発生する状況です)では、プロトコルは2つのフェーズで構成されます。
2フェーズコミット(2PC)プロトコルは、並行性制御プロトコルである2フェーズロック(2PL)プロトコルと混同してはならない。
このプロトコルは次のように動作します。1つのノードが指定されたコーディネーター(マスターサイト)であり、ネットワーク内の残りのノードは参加者として指定されます。このプロトコルは、以下のことを前提としています。
最後の前提条件は、ネットワーク通信は通常再ルーティングできるため、それほど制約的ではありません。最初の2つの前提条件ははるかに厳格です。ノードが完全に破壊された場合、データが失われる可能性があるからです。
プロトコルは、トランザクションの最終ステップが完了した後にコーディネーターによって開始されます。参加者は、トランザクションが参加者側で正常に処理されたかどうかに応じて、同意メッセージまたは中止メッセージで応答します。
コーディネーターがコミット要求フェーズ中にすべての参加者から同意メッセージを受け取った場合:
コミット要求フェーズ中にいずれかの参加者が反対票を投じた場合(またはコーディネーターのタイムアウトが経過した場合):
コーディネーター参加者 コミットするためのクエリ --------------------------------> 賛成/反対で投票準備/中止 <------------------------------- コミット/中止 コミット/ロールバック --------------------------------> 確認 コミット*/中止* <-------------------------------- 終わり
レコードタイプの横に * が付いている場合は、レコードが強制的に安定ストレージに保存されることを意味します。[ 4 ]
多くの場合、2PC プロトコルはコンピュータ ネットワークに分散されます。これは、互いに類似した複数の専用 2PC コンポーネントを実装することで容易に分散できます。これらのコンポーネントは通常、トランザクションマネージャ(TM、2PC エージェントまたはトランザクション処理モニタとも呼ばれる) と呼ばれ、各トランザクションに対してプロトコルを実行します (例: The Open GroupのX/Open XA )。分散トランザクションに関与するデータベース、参加者 (コーディネーターと参加者の両方) は、2PC を使用してトランザクションを終了するために、閉じる TM (通常は参加者と同じネットワーク ノード上に存在する) に登録します。各分散トランザクションには、トランザクション参加者が登録する TM のアドホック セットがあります。各トランザクションには、2PC を調整するリーダー、つまりコーディネーター TM が存在し、通常はコーディネーター データベースの TM です。ただし、パフォーマンスや信頼性の理由から、コーディネーターの役割を別の TM に転送することもできます。参加者は、互いに 2PC メッセージを交換するのではなく、それぞれの TM とメッセージを交換します。関連するトランザクションマシン(TM)は相互に通信し、それぞれの参加者を「代表」する上記の2PCプロトコルスキーマを実行して、トランザクションを終了します。このアーキテクチャにより、プロトコルは完全に分散型となり(中央処理コンポーネントやデータ構造は不要)、ネットワークノード数(ネットワーク規模)に応じて効率的に拡張できます。
この共通アーキテクチャは、2PC以外の他のアトミックコミットメントプロトコルの配布にも有効です。なぜなら、そのようなプロトコルはすべて同じ投票メカニズムとプロトコル参加者への結果伝播を使用するからです。[ 1 ] [ 2 ]
データベース研究では、プロトコルの最適化[ 1 ] [ 2 ] [ 3 ]や特定のシステム動作の仮定の下でのプロトコル操作の節約によってコストを削減しながら、2フェーズコミットプロトコルの利点のほとんどを得る方法について研究が行われてきました。
推定アボートまたは推定コミットは、このような最適化の一般的な例です。[ 2 ] [ 3 ] [ 5 ]トランザクションの結果がコミットまたはアボートのいずれかであるという仮定により、2PC プロトコルの実行中に参加者によるメッセージとログ記録操作の両方を節約できます。たとえば、推定アボートの場合、障害からのシステム復旧中に、復旧手順によって特定のトランザクションのコミットのログ記録証拠が見つからない場合、トランザクションがアボートされたと仮定し、それに応じて動作します。これは、アボートがログに記録されるかどうかは問題ではなく、この仮定の下ではそのようなログ記録を節約できることを意味します。通常、障害からの復旧中に、最適化の種類に応じて追加の操作のペナルティが発生します。したがって、最適化の最良のバリアント(存在する場合)は、障害とトランザクションの結果の統計に基づいて選択されます。
ツリー2PC プロトコル[ 2 ] (ネスト 2PC または再帰 2PC とも呼ばれる) は、コンピュータ ネットワークにおける 2PC の一般的なバリアントであり、基盤となる通信インフラストラクチャをより有効に活用します。分散トランザクションの参加者は通常、ツリー構造 (呼び出しツリー) を定義する順序で呼び出されます。このツリーでは、参加者がノード、呼び出し (通信リンク) がエッジです。2PC プロトコルでは、トランザクションを完了するために同じツリーが一般的に使用されますが、原理的には別の通信ツリーを使用することもできます。ツリー 2PC では、コーディネーターは通信ツリー (逆ツリー) のルート (「トップ」) と見なされ、参加者は他のノードです。コーディネーターは、トランザクションを開始したノード (他の参加者を再帰的に (推移的に) 呼び出したノード) である場合もありますが、同じツリー内の別のノードがコーディネーターの役割を担うこともできます。コーディネーターからの2PCメッセージはツリーを「下へ」伝播されますが、コーディネーターへのメッセージは、参加者が自分より下位のすべての参加者から「収集」し、適切なメッセージをツリーを「上へ」送信します(ただし、中止メッセージは、受信後または現在の参加者が中止を開始した場合に直ちに「上へ」伝播されます)。
動的2相コミット(動的2相コミット、D2PC)プロトコル[ 2 ] [ 6 ]は、事前にコーディネーターが定められていないTree 2PCのバリアントです。これは、以前に提案されたいくつかの最適化を包含しています。合意メッセージ(賛成票)は、トランザクションに代わってタスクを完了したとき(準備完了になったとき)に、すべてのリーフから伝播を開始します。中間(非リーフ)ノードは、合意メッセージがまだ受信されていない最後の(単一の)隣接ノードに合意メッセージを送信すると、準備完了を送信します。コーディネーターは、トランザクションツリー上で合意メッセージを競走させ、衝突した場所で動的に決定されます。衝突は、コーディネーターとなるトランザクションツリーノード、またはツリーエッジのいずれかで発生します。後者の場合、2つのエッジのノードのうちの1つがコーディネーターとして選出されます(任意のノード)。 D2PC は、特定のトランザクション ツリーのすべてのインスタンス、および任意の特定の Tree 2PC プロトコル実装の中で、時間的に最適です (すべてのインスタンスは同じツリーを持ち、各インスタンスは異なるノードをコーディネーターとして持ちます)。最適なコーディネーターを選択することで、D2PC はコーディネーターと各参加者の両方を可能な限り短い時間でコミットし、各トランザクション参加者 (ツリー ノード) のロックされたリソースを可能な限り早く解放できるようにします。