分散トランザクションに3PC(3フェーズコミットメント)を使用しています。 A、B、C、Dの4つのノードがあり、Aはコーディネーターです。このようなシナリオで3PCは何をしますか?
- Aは他の人からOKを受け取り、それらにコミット準備メッセージを送りました。
- CとDがこのメッセージを受信し、準備状態に移行したときにBがクラッシュし、このメッセージを受信しません(したがって、待機状態のままです)。
- タイムアウトがBであり、他のすべてにアボートを送信しますが、Dはアボートメッセージを受信しますが、Cはアボートメッセージを受信する前にクラッシュします。
ここで、問題は次のとおりです。回復後にCは何をしますか? http://courses.cs.vt.edu/~cs5204/fall00/distributedDBMS/sreenu/3pc.htmlによれば、Cは、Dのように中断するのではなく、障害遷移後の回復にコミットします。その結果、矛盾した状態になることはありませんか?またはCには、トランザクションが中止状態であることを検出するためのメカニズムがいくつかありますか?
申し訳ありませんが、タイプミスがあります。最後の段落でBをCに変更しました。コーディネーターがCをチェックして回復した後にメッセージを再送するかどうかは不明です。 – cntswj
私はあなたの意見を見て、私はそれをどうやって入れ替えるべきか分からなかった。今、記事https://www.researchgate.net/publication/275154978_Three-Phase_Commitが見つかりました。私はそこから引用します: "参加者が取引に関して事前コミット状態にあっても回復する参加者はトランザクションをコミットできません。これは、すべてのサイトで操作が中止される可能性があるためです。参加者は誰もが事前コミット状態にない場合は失敗しました。この場合、参加者は他のサイトに取引の最終ステータスを尋ねる必要があります。 – chalda
この点は、Cが回復していることです。 Cは、コーディネーターが指示されるのを待って状態を見つけることができます。あるいは、他の参加者に最終的な状態を理解するよう依頼することもできます。これは実装次第です。 – chalda