トランザクション通知

KTM は、各リソース マネージャーの通知キューを提供します。 KTM は、リソース マネージャーのキューに配置することで、リソース マネージャーに通知を配信します。

リソース マネージャーは、キューから同期的または非同期的に通知を取得できます。

  • 通知を同期的に取得するために、リソース マネージャーは ZwGetNotificationResourceManager を繰り返し呼び出すことができます。

  • 通知を非同期的に受信するために、リソース マネージャーは TmEnableCallbacks を呼び出してコールバック ルーチンを設定できます。 KTM は、リソース マネージャーのキューに通知を送信するたびにコールバック ルーチンを呼び出します。

リソース マネージャーが ZwCreateEnlistment を呼び出してトランザクションの参加リストを作成すると、リソース マネージャーは受信する通知の種類を指定します。 リソース マネージャーは、受信に登録した通知のみを受け取ります。

通知定数は Ktmtypes.h で定義されます。 通知定数名の形式は TRANSACTION_NOTIFY_Xxx です。

以下に Ktmtypes.h が定義し、それらを 3 つのグループに分割するすべての通知定数のリストを示します。

  • リソース マネージャーが受信できる通知

  • 上位トランザクション マネージャーが受信できる通知

  • 定義されているが現在使用されていない通知定数

リソース マネージャーの通知

後で ZwReadOnlyEnlistment を呼び出して参加リストを読み取り専用としてマークする場合でも、すべてのリソース マネージャーは、TRANSACTION_NOTIFY_PREPREPARE、TRANSACTION_NOTIFY_PREPARE、および TRANSACTION_NOTIFY_COMMIT 通知を受信するために登録する必要があります。

リソース マネージャーは TRANSACTION_NOTIFY_SINGLE_PHA Standard Edition_COMMIT をサポートできますが、マルチフェーズの事前準備、準備、コミット通知もサポートする必要があります。

次のリストには、リソース マネージャーが受け取ることができるすべての通知が含まれています。

TRANSACTION_NOTIFY_PREPREPARE
送信時: クライアントが ZwCommitTransaction を呼び出し、リソース マネージャーが単一フェーズ コミットをサポートしていない場合、または上位トランザクション マネージャーZwPrePrepareEnlistment を呼び出す場合。

受信者: リソース マネージャー。

受信者の必要なアクション: 事前準備操作を実行し、ZwPrePrepareComplete を呼び出します。 (事前準備操作の詳細については、コミット操作の処理を参照してください。)

制限事項: リソース マネージャーは、TRANSACTION_NOTIFY_PREPARE と TRANSACTION_NOTIFY_COMMIT もサポートする必要があります。

TRANSACTION_NOTIFY_PREPARE
送信時: クライアントが ZwCommitTransaction を呼び出し、リソース マネージャーが単一フェーズコミットをサポートしていない場合、または上位トランザクション マネージャーが ZwPrepareEnlistment を呼び出した場合の、TRANSACTION_NOTIFY_PREPREPARE の後。

受信者: リソース マネージャー。

受信者の必要なアクション: 事前準備操作を実行し、ZwPrePrepareComplete を呼び出します。 (事前準備操作の詳細については、コミット操作の処理を参照してください。)

制限事項: リソース マネージャーは、TRANSACTION_NOTIFY_PREPREPARE と TRANSACTION_NOTIFY_COMMIT もサポートする必要があります。

TRANSACTION_NOTIFY_COMMIT
送信時: クライアントが ZwCommitTransaction を呼び出し、リソース マネージャーが単一フェーズコミットをサポートしていない場合、または上位トランザクション マネージャーが ZwCommitEnlistment を呼び出した場合の、TRANSACTION_NOTIFY_PREPARE の後。

受信者: リソース マネージャー。

受信者の必要なアクション: コミット操作を実行し、ZwCommitComplete を呼び出します。 (コミット操作の詳細については、コミット操作の処理を参照してください。)

制限事項: リソース マネージャーは、TRANSACTION_NOTIFY_PREPREPARE と TRANSACTION_NOTIFY_PREPARE もサポートする必要があります。

TRANSACTION_NOTIFY_SINGLE_PHASE_COMMIT
送信時: クライアントが ZwCommitTransaction を呼び出し、リソース マネージャーが単一フェーズのコミット操作をサポートしている場合。

受信者: リソース マネージャー。

受信者の必要なアクション: トランザクションをコミットするか、ZwSinglePhaseReject を呼び出します。 (単一フェーズのコミット操作の詳細については、コミット操作の処理を参照してください。)

制限事項: リソース マネージャーは、TRANSACTION_NOTIFY_PREPREPARE、TRANSACTION_NOTIFY_PREPARE、および TRANSACTION_NOTIFY_COMMIT もサポートする必要があります。

TRANSACTION_NOTIFY_ROLLBACK
送信時: クライアントが ZwRollbackTransaction を呼び出し、上位トランザクション マネージャーが ZwRollbackEnlistment を呼び出すか、KTM がエラー (ログ ストリームへの書き込みに失敗するなど) を検出した場合。

受信者: リソース マネージャーと上位トランザクション マネージャーの両方。

受信者の必要なアクション: トランザクションのデータをロール バックするために必要な操作を実行し、ZwRollbackComplete を呼び出します。 (ロールバック操作の詳細については、ロールバック操作の処理を参照してください。)

制限事項: すべてのリソース マネージャーと上位トランザクション マネージャーは、TRANSACTION_NOTIFY_ROLLBACK をサポートする必要があります。

TRANSACTION_NOTIFY_RECOVER
送信時: リソース マネージャーが ZwRecoverResourceManager を呼び出す場合。

受信者: リソース マネージャー。

受信者の必須アクション: リソース マネージャーは ZwRecoverEnlistment を呼び出す必要があります。 (復旧操作の詳細については、復旧操作の処理を参照してください。)

制限事項: なし。

TRANSACTION_NOTIFY_LAST_RECOVER
送信時: KTM がリソース マネージャーの参加リストの最後の TRANSACTION_NOTIFY_RECOVER を送信した後。

受信者: リソース マネージャー。

受信者の必要なアクション: 復旧操作を終了します。 (復旧操作の詳細については、復旧操作の処理を参照してください。)

制限事項: なし。

TRANSACTION_NOTIFY_INDOUBT
送信時: リソース マネージャーが ZwRecoverEnlistment を呼び出した後、KTM がトランザクションをコミットするかロールバックするかを判断できない場合 (通常、TPS には使用できない上位トランザクション マネージャーがあるため)。

受信者: リソース マネージャー。

受信者の必要なアクション: KTM が TRANSACTION_NOTIFY_COMMIT または TRANSACTION_NOTIFY_ROLLBACK を送信するまで何も行いません。

制限事項: なし。

TRANSACTION_NOTIFY_RM_DISCONNECTED
送信時: 単一フェーズのコミット操作を処理しているリソース マネージャーが、トランザクションがコミットまたはロールバックされたことを示さずに、参加ハンドルを閉じた場合。

受信者: リソース マネージャーと、トランザクションに参加している上位トランザクション マネージャー。

受信者の必要なアクション: トランザクション固有のクリーンアップ操作。 通常、この通知は読み取り専用のリソース マネージャーに役立ちます。

制限事項: なし。

上位トランザクション マネージャーの通知

上位トランザクション マネージャーは、次の通知を受け取ることができます。

TRANSACTION_NOTIFY_ROLLBACK
前の説明を参照してください。

TRANSACTION_NOTIFY_RM_DISCONNECTED
前の説明を参照してください。

TRANSACTION_NOTIFY_PREPREPARE_COMPLETE
送信時: すべてのリソース マネージャーが TRANSACTION_NOTIFY_PREPREPARE を受信し、ZwPrePrepareComplete を呼び出して応答した後。

受信者: 上位トランザクション マネージャー。

受信者の必要なアクション: 上位トランザクション マネージャーは ZwPrepareEnlistment を呼び出す必要があります。

TRANSACTION_NOTIFY_PREPARE_COMPLETE
送信時: すべてのリソース マネージャーが TRANSACTION_NOTIFY_PREPARE を受信し、ZwPrepareComplete を呼び出して応答した後。

受信者: 上位トランザクション マネージャー。

受信者の必要なアクション: 上位トランザクション マネージャーは ZwCommitEnlistment を呼び出す必要があります。

TRANSACTION_NOTIFY_COMMIT_COMPLETE
送信時: すべてのリソース マネージャーが TRANSACTION_NOTIFY_COMMIT を受信し、ZwCommitComplete を呼び出して応答した後。

受信者: 上位トランザクション マネージャー。

受信者の必要なアクション: トランザクション クリーンアップ操作。

TRANSACTION_NOTIFY_ROLLBACK_COMPLETE
送信時: すべてのリソース マネージャーが TRANSACTION_NOTIFY_ROLLBACK を受信し、ZwRollbackComplete を呼び出して応答した後。

受信者: 上位トランザクション マネージャー。

受信者の必要なアクション: トランザクション クリーンアップ操作。

TRANSACTION_NOTIFY_RECOVER_QUERY
送信時: 上位トランザクション マネージャーが ZwRecoverResourceManager を呼び出した場合。

受信者: 上位トランザクション マネージャー。

受信者の必要なアクション: 上位トランザクション マネージャーは、参加に対して ZwCommitEnlistment または ZwRollbackEnlistment を呼び出す必要があります。

TRANSACTION_NOTIFY_COMMIT_REQUEST
送信時: クライアントは ZwCommitTransaction を呼び出します。 上位トランザクション マネージャーがこの登録通知に登録されている場合、KTM はリソース マネージャーに TRANSACTION_NOTIFY_COMMIT を送信するのではなく、代わりに上位トランザクション マネージャーに TRANSACTION_NOTIFY_COMMIT_REQUEST を送信します。

受信者: 上位トランザクション マネージャー。

受信者の必要なアクション: 上位トランザクション マネージャーは ZwCommitEnlistment を呼び出します。

TRANSACTION_NOTIFY_REQUEST_OUTCOME
送信時: リソース マネージャーが、トランザクションが準備状態にある間に TmRequestOutcomeEnlistment を呼び出した場合。

受信者: 上位トランザクション マネージャー。

受信者の必要なアクション: 上位トランザクション マネージャーは、ZwCommitEnlistment または ZwRollbackEnlistment を呼び出す必要があります。

使用されていない通知

次の通知は Ktmtypes.h で定義されていますが、KTM では現在サポートされていません。

TRANSACTION_NOTIFY_DELEGATE_COMMIT

TRANSACTION_NOTIFY_ENLIST_MASK

TRANSACTION_NOTIFY_ENLIST_PREPREPARE

TRANSACTION_NOTIFY_MARSHAL

TRANSACTION_NOTIFY_PROMOTE

TRANSACTION_NOTIFY_PROMOTE_NEW

TRANSACTION_NOTIFY_PROPAGATE_PULL

TRANSACTION_NOTIFY_PROPAGATE_PUSH

TRANSACTION_NOTIFY_TM_ONLINE

TRANSACTION_NOTIFY_COMMIT_FINALIZE