回復操作の処理

回復操作では、トランザクション処理システム (TPS) はログ ストリーム内の情報から状態の回復を試みます。 回復操作が完了すると、すべてのトランザクションがコミット済みまたはロールバック状態になり、すべてのリソース データが既知の正常な状態になっている必要があります。

すべてのトランザクションが完了する前に TPS が停止することがあります。 たとえば、オペレーティング システムがクラッシュする可能性があります。 そのため、リソース マネージャーは、実行を開始するたびに回復操作を開始する必要があります。 回復操作は、トランザクションが不完全かどうかを判断しようとします。 不完全なトランザクションがログで見つかった場合、回復操作はこれらのトランザクションのコミットまたはロールバックを試みます。

KTM ベースの TPS の場合、各回復操作は 2 つの手順で構成されます。 最初の手順では、トランザクション マネージャー オブジェクトのログ ストリームから情報を回復します。 2 番目の手順では、リソース マネージャーのログ ストリームから情報を回復します。

TPS は、すべてのログ ストリームの末尾に回復することができます。リソース マネージャーに仮想クロック値が保持されている場合、指定されたクロック値まで回復できます。

トランザクション マネージャー オブジェクトのログ ストリームからの情報の回復

リソース マネージャーが ZwCreateTransactionManager または ZwOpenTransactionManager を呼び出した直後に、ZwRecoverTransactionManager を呼び出す必要があります。 ZwRecoverTransactionManager ルーチンは、トランザクション マネージャー オブジェクトに属するログ ストリームを読み取ります。 このルーチンは、KTM によって作成された最後の再起動領域から始まり、ストリームの末尾で終了するログ ストリーム内の回復情報から、トランザクション マネージャー オブジェクト (すべてのトランザクション、参加リスト、リソース マネージャーを含む) の状態を再構築します。

最後の再起動領域から指定された仮想クロック値まで回復させるため、リソース マネージャーは ZwRecoverTransactionManager ではなく ZwRollforwardTransactionManager を呼び出すことができます。

リソース マネージャーのログ ストリームからの情報の回復

リソース マネージャーは、ZwCreateResourceManager または ZwOpenResourceManager を呼び出した直後、ZwRecoverResourceManager を呼び出す必要があります。 ZwRecoverResourceManager ルーチンは、各リソース マネージャーの参加リストに関連付けられているトランザクションの復旧を試みます。

リソース マネージャーが ZwRecoverResourceManager を呼び出すと、KTM はリソース マネージャーの各参加リストに対して TRANSACTION_NOTIFY_RECOVER 通知を送信します。 リソース マネージャーは、TRANSACTION_NOTIFY_RECOVER 通知のいずれかを受信するたびに ZwRecoverEnlistment を呼び出す必要があります。

リソース マネージャーが ZwRecoverEnlistment を呼び出すと、KTM は次のいずれかの通知を送信します。

  • TRANSACTION_NOTIFY_COMMIT

    リソース マネージャーは、ログ ストリームの情報を使用してトランザクションをコミットし、ZwCommitComplete を呼び出す必要があります。

  • TRANSACTION_NOTIFY_ROLLBACK

    リソース マネージャーは、ログ ストリームの情報を使用してトランザクションをロールバックし、ZwRollbackComplete を呼び出す必要があります。

  • TRANSACTION_NOTIFY_INDOUBT

    KTM は、トランザクションの状態を判断しておらず、コミットまたはロールバック通知を後で送信します。

通常、KTM は、TPS が停止して再起動する前にすべてのリソース マネージャーが ZwPrepareComplete を呼び出したと判断した場合、TRANSACTION_NOTIFY_COMMIT 通知を送信します。 KTM は、1 つ以上のリソース マネージャーが ZwPrepareComplete を呼び出さなかったと判断した場合、TRANSACTION_NOTIFY_ROLLBACK 通知を送信します。

KTM は、各参加リストの TRANSACTION_NOTIFY_RECOVER 通知を送信した後、TRANSACTION_NOTIFY_LAST_RECOVER 通知を送信します。

リソース マネージャーが ZwRecoverTransactionManager ではなく ZwRollforwardTransactionManager を呼び出した場合、ZwRollforwardTransactionManager に指定した仮想クロック値までしか回復できません。

リソース マネージャーは、ZwSetInformationEnlistment を呼び出して、カスタマイズされた回復情報を設定できます。 KTM はこの情報を保存し、ログ ストリームに書き込みますが、KTM は情報を解釈しようとしません。 リソース マネージャーは、ZwQueryInformationEnlistment を呼び出すことによって、いつでも回復情報を取得できます。

上位トランザクション マネージャーは、回復操作中に TRANSACTION_NOTIFY_RECOVER_QUERY 通知を受け取ることがあります。