2 フェーズ コミット プロトコルが本当に ACID プロパティ、特にその「A」部分を保証するかどうか疑問に思う状況に遭遇しました。
2 つのリソースを含む理論上の分散トランザクションを見てみましょう。(私が対処しなければならなかった問題のより実用的な説明は、私のブログで見つけることができます)。シナリオは、分散トランザクションの通常の実行です (障害や回復はありません)。アプリケーションはトランザクションを開始し、両方のリソースを更新して commit() 呼び出しを発行します。コミットが完了すると、アプリケーションは両方のリソースをチェックし、完了したトランザクションからのすべての変更を確認します。すべて順調です。2PC プロトコルは機能しましたね。
さて、シナリオに少し変更を加えます。分散トランザクションが commit() を実行している間、別のアプリケーションが同じ 2 つのリソースにアクセスします。トランザクションからの変更の一部だけを確認できますか? 1 つのリソースへの変更は既に表示されているが、2 番目のリソースへの変更はまだ表示されていないとします。
私が 2PC プロトコルについて読んだすべての情報では、個々のリソースの相互の変更の可視性に関する保証を見つけることができませんでした。また、すべてのリソースが個々のコミットをまったく同時に終了することを示すものは見つかりませんでした。