2フェーズでコーディネーターとコホートが同時に失敗し、コーディネーターがコミットメッセージを決定したかどうかを知ることができない場合、「2フェーズコミット」の問題を解決するために3フェーズコミットが行われたことを理解しています。
どうやら3フェーズコミットは、余分なフェーズを追加することによってこの問題を解決することを目的としています。しかし、コーディネーターとコホートが失敗した場合、第3フェーズでまったく同じ問題に直面しませんか?
2フェーズでコーディネーターとコホートが同時に失敗し、コーディネーターがコミットメッセージを決定したかどうかを知ることができない場合、「2フェーズコミット」の問題を解決するために3フェーズコミットが行われたことを理解しています。
どうやら3フェーズコミットは、余分なフェーズを追加することによってこの問題を解決することを目的としています。しかし、コーディネーターとコホートが失敗した場合、第3フェーズでまったく同じ問題に直面しませんか?
3PCでは、残りのアクティブなコホートにクエリを実行することで、失敗したコーディネーターの決定を把握できます。アクティブなコホートが事前コミット状態にある場合、つまり、すべてのコホートがコミットに同意したことを意味します(そうでない場合、コーホートは事前コミットを送信しませんでした)。そして、失敗したコホートがコミットした可能性があるため、残りのコホートをコミットする必要があります。
どのコホートもコミット前の状態にない場合-コーディネーターがどのコホートにも「コミット」を送信していないと想定できるため、副作用は発生しておらず、中止できます。
ここに良い説明があります:http: //the-paper-trail.org/blog/consensus-protocols-three-phase-commit/