2017-07-18 1 views
0

分散トランザクションに3PC(3フェーズコミットメント)を使用しています。 A、B、C、Dの4つのノードがあり、Aはコーディネーターです。このようなシナリオで3PCは何をしますか?

  1. Aは他の人からOKを受け取り、それらにコミット準備メッセージを送りました。
  2. CとDがこのメッセージを受信し、準備状態に移行したときにBがクラッシュし、このメッセージを受信しません(したがって、待機状態のままです)。
  3. タイムアウトがBであり、他のすべてにアボートを送信しますが、Dはアボートメッセージを受信しますが、Cはアボートメッセージを受信する前にクラッシュします。

ここで、問題は次のとおりです。回復後にCは何をしますか? http://courses.cs.vt.edu/~cs5204/fall00/distributedDBMS/sreenu/3pc.htmlによれば、Cは、Dのように中断するのではなく、障害遷移後の回復にコミットします。その結果、矛盾した状態になることはありませんか?またはCには、トランザクションが中止状態であることを検出するためのメカニズムがいくつかありますか?

答えて

0

私はBノードの動作についてのあなたの質問に間違った仮定があると思いますか? Bが準備済み状態に移行する前にクラッシュした場合、Bは再起動後に状態を待機することになり、中止されます。

私は、Cノードがコーディネーターによって指示されたとおりに中止されることを期待しています。私はこれが2PCに似ていると思う。失われたノードが再び利用可能かどうかは定期的にチェックするのはコーディネーターの責任です。 Cが再起動されると、コーディネーターはそれを見ることができ、アボートメッセージが再送信されるようにロールバックされるようにノードをプッシュすることができます。

+0

申し訳ありませんが、タイプミスがあります。最後の段落でBをCに変更しました。コーディネーターがCをチェックして回復した後にメッセージを再送するかどうかは不明です。 – cntswj

+0

私はあなたの意見を見て、私はそれをどうやって入れ替えるべきか分からなかった。今、記事https://www.researchgate.net/publication/275154978_Three-Phase_Commitが見つかりました。私はそこから引用します: "参加者が取引に関して事前コミット状態にあっても回復する参加者はトランザクションをコミットできません。これは、すべてのサイトで操作が中止される可能性があるためです。参加者は誰もが事前コミット状態にない場合は失敗しました。この場合、参加者は他のサイトに取引の最終ステータスを尋ねる必要があります。 – chalda

+0

この点は、Cが回復していることです。 Cは、コーディネーターが指示されるのを待って状態を見つけることができます。あるいは、他の参加者に最終的な状態を理解するよう依頼することもできます。これは実装次第です。 – chalda

関連する問題