質問

通常の 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」について:

トランザクションマネージャーは、リソースマネージャーと調整して、すべてが要求された作業を成功させるか、完了した場合に作業を行わないことを確認し、酸性特性を維持します。

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

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

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top