通常の ACID トランザクションがどのように機能するか、あいまいな方法で理解しています。ある種のコミットフラグが設定されるまで作業が確認されないように、データベースでいくつかの作業を実行します。コミット部分は、いくつかの基本的な仮定に基づいています (単一のディスク ブロックの書き込みがアトミックであるなど)。壊滅的なエラーが発生した場合は、リカバリ フェーズでコミットされていないデータを消去できます。
分散トランザクションはどのように機能しますか? MS のドキュメントのいくつかで、データベースとファイルシステム間で何らかの方法でトランザクションを実行できることを読みました (とりわけ)。
このテクノロジーは、プログラムを完全にインストールするか、完全に存在させないようにするインストーラーに使用できます (おそらく使用されています)。インストーラーの開始時にトランザクションを開始するだけです。次に、レジストリとファイルシステムに接続して、インストールを定義する変更を行います。ジョブが完了したら、単純にコミットするか、何らかの理由でインストールが失敗した場合はロールバックします。レジストリとファイル システムは、この魔法の分散トランザクション コーディネーターによって自動的にクリーンアップされます。
2 つの異なるシステムがこのように処理される可能性はありますか? ファイルシステムが変更をコミットし、レジストリがコミットしていないという、一貫性のない状態でシステムを放置することは常に可能であるように私には思えます。MSDTC では、ネットワークを介してトランザクションを実行することさえ可能だと思います。
http://blogs.msdn.com/florinlazar/archive/2004/03/04/84199.aspxを読みましたが、説明の冒頭に過ぎず、手順 4 を大幅に拡張する必要があるように感じます。
編集: http://en.wikipedia.org/wiki/Distributed_transactionで収集したものから、2 フェーズ コミット ( http://en.wikipedia.org/wiki/Two-phase_commit )によって実現できます。これを読んだ後でも、私はまだこの方法を 100% 理解していません。ステップ間にエラーの余地がたくさんあるようです。