回復の実行

リソース マネージャーは、リソース障害の後にトランザクション参加要素を再参加させることにより、トランザクションの永続参加リストの解決を容易にします。

回復プロセス

後で回復できるリソースを永続的に参加させるには (IEnlistmentNotification インターフェイスの実装により記述)、EnlistDurable メソッドを呼び出す必要があります。 さらに、リソース障害発生時にトランザクションの参加要素に一貫したラベル付けを行うためのリソース マネージャー識別子 (EnlistDurable) を Guid メソッドに提供する必要があります。 このため、最初の Enlist 呼び出し時に提供される Guid は、回復中の Reenlist 呼び出しの resourceManagerIdentifier パラメーターと同じである必要があります。 そうでない場合、TransactionException がスローされます。 永続参加リストの詳細については、「トランザクションの参加要素としてのリソースの参加」を参照してください。

2PC プロトコルの準備フェーズ (フェーズ 1) で、永続的リソース マネージャーの実装が Prepare 通知を受け取った場合、このフェーズ中にその準備レコードをログに記録する必要があります。 このレコードには、コミット時にトランザクションを完了するために必要なすべての情報を含める必要があります。 preparingEnlistment コールバックの RecoveryInformation プロパティを取得することにより、後で回復中に準備レコードにアクセスできます。 Prepare メソッド内でレコードのログ記録を実行する必要はありません。RM がワーカー スレッド上でこの処理を実行できるためです。

回復プロセスは、次の 2 つの手順から構成されます。

手順 1 - 再参加

リソース マネージャーは、不明な各参加の準備情報レコードについて調べます。 そのためには、フェーズ 1 の RecoveryInformation 通知でリソース マネージャーに渡された PreparingEnlistment コールバックの Prepare プロパティを調べます。

対象の各参加について、トランザクション マネージャーで Reenlist を呼び出します。 このメソッドは、リソース マネージャーを識別する一意の Guid と、バイト配列の参加情報を渡します。 新しい Enlistment オブジェクトが返されます。 再参加が失敗して例外がスローされた場合、リソース マネージャーは後で再試行する必要があります。

失敗後にリソース マネージャーを再起動するときは、Reenlist メソッドのみを呼び出す必要があります。 また、2 フェーズ コミットの最初の準備フェーズ中に、リソース マネージャーによってログ記録された未解決トランザクションのみを再参加させる必要があります。 無効な時間にこのメソッドを呼び出した場合、間違った結果が生成される可能性があります。

参加要素がこのメソッドを使用して再参加すると、トランザクションの結果に対応した IEnlistmentNotification のフェーズ 2 のメソッド (つまり、CommitRollback、または InDoubt) が必要に応じて呼び出されます。

手順 2 - 回復の完了

すべての再参加が完了すると、リソース マネージャーは RecoveryComplete メソッドを呼び出します。 このメソッドは回復を完了し、リソース マネージャーに不明なトランザクションがもう存在しないことをトランザクション マネージャーに通知します。 これによりリソース マネージャーは、再び Reenlist メソッドを呼び出さないことを保証します。

リソース マネージャーは、新しいトランザクションに参加する前に、不明なトランザクションをすべて解決する必要はありません。 リソース マネージャーは、トランザクション マネージャーとの関係を確立した後、いつでも最初の手順を実行できますが、RecoveryComplete が呼び出された (手順 2) 後で、手順 1 を再実行することはできません。 手順 2 は、トランザクションの結果に影響を与えることなく、複数回繰り返すことができます。