トランザクション通知
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