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