1. ホーム
  2. database

[解決済み] 二相コミットはどのように最後の一秒の失敗を防ぐのか?

2023-05-08 09:51:46

質問

私は、分散トランザクション全体で2相コミットがどのように動作するかを研究しています。私の理解では、フェーズの最後の部分で、トランザクションコーディネーターは、それがコミットする準備ができているかどうか、各ノードに尋ねます。誰もが同意した場合、それは先に進み、コミットするようにそれらを伝える。

次の失敗を防ぐものは何ですか?

  1. すべてのノードが コミットする準備ができている
  2. トランザクション コーディネーターは彼らに "先にコミット" するように指示します。 とコミットするように指示しますが、ノードの 1 つが を受け取る前にクラッシュしてしまいます。 メッセージ
  3. 他のすべてのノードが正常にコミットしますが、分散トランザクションが破損しています。
  4. 私の理解では、クラッシュしたノードが戻ってきたとき、そのトランザクションはロールバックされています (コミットメッセージを受け取っていないため)。

私は、各ノードが分散トランザクションについて何も知らない通常のデータベースを実行していると仮定しています。私は何を見逃したのでしょうか?

どのように解決するのですか?

みんなの答えをまとめる。

  1. 通常のデータベースを分散トランザクションで使用することはできません。データベースはトランザクションコーディネータを明示的にサポートしなければなりません。

  2. いくつかのノードがすでにコミットしているため、ノードはロールバックするように指示されません。何が起こるかというと、クラッシュしたノードが戻ってきたときに、トランザクションコーディネーターがコミットを終了するように指示します。