1

私が理解している限りでは、2 フェーズ コミットが実行される前に、トランザクションを各サイトに送信するための往復通信が必要です。各サイトはトランザクションの一部を実行し、コーディネーターがすべてのサイトから応答を受け取ると、2 フェーズ コミットを実行します。これにより、準備フェーズなどが開始されます。

2 フェーズ コミットに先行する実行から準備フェーズを分離する必要があるのはなぜですか? 実行フェーズと準備フェーズをマージして、往復の通信コストを削減しない理由はありますか?

これは私の前の質問へのフォローアップです。

4

1 に答える 1

0

このようにするのには、いくつかの正当な理由があります。

  1. 操作には、他のサイトからのデータが必要になる場合があります。実行フェーズと準備フェーズをマージする場合、異なるサイトのデータ項目間で swap(a,b) 操作をどのように実装しますか?
  2. コーディネーターは、パフォーマンスのボトルネックになる可能性があります。実行フェーズと提案フェーズをマージすると、アプリケーション データの中継に関与し、さらに過負荷になります。
  3. 透明性とカプセル化。前の質問への回答の begin/commit の間のコード(つまり、ビジネス ロジック) は、分散トランザクションにはまったく関係がないことに注意してください。どのサイト、さらにはいくつのサイトが関与するかを知る必要はありません! 未知のサイトへのリモート呼び出しである可能性がある (またはそうでない可能性がある) 任意の手順を呼び出します。実行をマージして準備するには、アプリケーション ロジックを参加者ごとに独立したコールバックに明示的にパッケージ化する必要があります。

さらに、永続性を伴うパフォーマンスについて考えるときは、ログのフラッシュを意味するラウンドトリップについて考慮する必要があります。実行フェーズ中の呼び出しは、ログをフラッシュする必要がないため、準備フェーズとコミット フェーズよりもはるかにコストがかかりません。

于 2012-11-18T11:10:01.217 に答える