2

を実装してリソースマネージャーを作成していますIEnlistmentNotification。私は耐久性のある RM を作成しようとしていますが、いくつかの質問がありました。

  1. IEnlistmentNotificationトランザクションごとにオブジェクトが必要ですか、それとも単一のIEnlistmentNotificationオブジェクトですべてのトランザクションを処理する必要がありますか?

    各トランザクションはそれ自体が必要になると思うので、トランザクションごとに準備/コミット/ロールバックを実行できます。

  2. リカバリ ファイルはどのように処理されますか?

    私の想定では、トランザクションで発生するすべてのものが、準備中に回復ファイルに書き込まれるということです。

    各トランザクションの情報をどのように分離できますか? 各トランザクションには個別のファイルがあるか、単一のファイルに回復操作ごとに何らかのトランザクション ID があると思います。

    リカバリが発生している場合Transaction.Current.TransactionInformation.DistributedIdentifier/LocalIdentifier、クラッシュ前と同じですか? したがって、これらの ID の 1 つを使用して、リカバリー中にトランザクションを識別することができます。

  3. 回復はどのように起こりますか?

    内部でリソース マネージャを使用している場合TransactionScope、スコープの途中でシステムがクラッシュ (プラグが抜かれるなど) した場合、システムがバックアップを開始したときにどのように回復しますか? スコープを持つコードを実行していたプロセスが、システムのクラッシュなどについて知っていると思いますか? その場合、実際にリカバリを処理するためにどのシステム/プログラム/サービスがセットアップされていますか?

4

1 に答える 1

1

RavenDB Source Codeですべての答えを見つけたと思います。

  1. はい、すべてのトランザクションには独自の IEnlistmentNotification が必要です。
  2. はい、'Transaction.TransactionInformation.DistributedIdentifier/LocalIdentifier' を使用して、回復ファイル内のトランザクションを追跡します。
  3. コードを実行しているアプリは、回復が必要かどうかを確認し、プラグが抜かれたときに完了しなかったトランザクションを再登録します。
于 2011-11-09T19:27:04.063 に答える