回復の実行

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

回復プロセス

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

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

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

手順 1 - 再参加

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

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

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

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

手順 2 - 回復の完了

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

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

Footer image

Copyright © 2007 by Microsoft Corporation.All rights reserved.