ロールバック操作の処理

リソース マネージャー、トランザクション クライアント、または KTM は、トランザクションをコミットしてはならないと判断した場合にトランザクションをロールバックできます (通常はエラーが検出されたため)。

トランザクションをロールバックするため、リソース マネージャーは ZwRollbackEnlistment を呼び出すことができます。 リソース マネージャーは、ZwCreateEnlistment を呼び出してトランザクションに参加した後、ZwPrepareComplete を呼び出す前に、いつでもトランザクションをロールバックできます。

トランザクション クライアントは、ZwRollbackTransaction を呼び出すことによってトランザクションをロールバックできます。 トランザクション クライアントは、ZwCreateTransaction を呼び出してトランザクションを作成した後、ZwCommitTransaction を呼び出す前にいつでもトランザクションをロールバックできます。

さらに、トランザクション クライアントは、ZwSetInformationTransaction を呼び出すことにより、トランザクションのタイムアウト値を設定できます。 KTM は、指定された時間でコミットされていない場合、トランザクションをロールバックします。

ZwRollbackEnlistment または ZwRollbackTransaction の呼び出しが行われた場合、またはタイムアウト値を超えた場合、KTM はすべてのリソース マネージャーに TRANSACTION_NOTIFY_ROLLBACK 通知を送信します。

各リソース マネージャーは、TRANSACTION_NOTIFY_ROLLBACK 通知を受け取ったら、以下の操作を行う必要があります。

  1. トランザクションのデータを、リソース マネージャーがトランザクションに参加する前の状態に復元します。

    通常、リソース マネージャーは、トランザクションの保存された初期データをログ ストリームからデータベースのパブリックな永続的ストレージにコピーすることにより、トランザクションのデータを復元します。 ログ ストリームの使用方法について詳しくは、「KTM でのログ ストリームの使用」をご覧ください。

  2. ZwRollbackComplete を呼び出します。

ZwRollbackComplete を呼び出した後、リソース マネージャーは ZwClose を呼び出して、参加ハンドルを閉じる必要があります。

リソース マネージャーがロールバック操作を開始した場合、そのクライアント インターフェイスを使用して、トランザクションが失敗したことをクライアントに通知する必要があります。