14

通常の 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% 理解していません。ステップ間にエラーの余地がたくさんあるようです。

4

1 に答える 1

4

「ステップ4」について:

トランザクション マネージャーは、リソース マネージャーと連携して、要求された作業をすべて正常に実行するか、完了したとしても何も実行しないようにすることで、ACID プロパティを維持します。

もちろん、これにはすべての参加者が適切なインターフェースと (エラーのない) 実装を提供する必要があります。インターフェイスは漠然​​と次のように見えます。

public interface ITransactionParticipant {
    bool WouldCommitWork();
    void Commit();
    void Rollback();
}

トランザクション マネージャは、コミット時にすべての参加者に対して、トランザクションをコミットする意思があるかどうかを問い合わせます。参加者は、許容されるすべてのエラー条件 (検証、システム エラーなど) の下でこのトランザクションをコミットできる場合にのみ、これをアサートできます。すべての参加者がトランザクションをコミットする能力を主張した後、マネージャーはCommit()メッセージをすべての参加者に送信します。いずれかの参加者がエラーまたはタイムアウトを発生させた場合、トランザクション全体が中止され、個々のメンバーがロールバックされます。

このプロトコルでは、参加者がコミットする能力を主張する前に、トランザクションの内容全体を記録する必要があります。もちろん、これは、さまざまな種類の障害から回復できるように、特別なローカル トランザクション ログ構造に存在する必要があります。

于 2008-09-11T06:31:04.537 に答える