次の方法で共有


トランザクション通知

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_PHASE_COMMITをサポートできますが、マルチフェーズの事前準備、準備、コミット通知もサポートする必要があります。

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

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

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

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

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

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

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

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

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

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

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

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

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

トランザクション_通知_単一フェーズ_コミット
送信時: クライアントは ZwCommitTransaction を 呼び出し、リソース マネージャーは単一フェーズのコミット操作をサポートします。

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

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

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

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

受信元: リソース マネージャーと優れたトランザクション マネージャーの両方。

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

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

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

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

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

制限: 何一つ。

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

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

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

制限: 何一つ。

トランザクション_通知_未確定
送信時: リソース マネージャーが ZwRecoverEnlistment を呼び出した後、KTM がトランザクションをコミットするかロールバックするかを判断できない場合 (通常、TPS に優先するトランザクション マネージャーが利用不可であるため)。

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

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

制限: 何一つ。

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

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

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

制限: 何一つ。

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

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

トランザクション通知ロールバック
前の説明を参照してください。

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を受信し、 ZwRollbackComplete を呼び出して応答した後。

受信元: 優れたトランザクションマネージャー。

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

トランザクション通知復旧クエリ
送信時: 上位のトランザクション マネージャーが ZwRecoverResourceManager を呼び出します。

受信者: 優れたトランザクション マネージャー。

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

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

受信したのは: 優れたトランザクション マネージャー。

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

取引通知要求結果
送信時: リソース マネージャーは、トランザクションが準備状態にある間に TmRequestOutcomeEnlistment を呼び出します。

受信元: 優れたトランザクションマネージャー。

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

未使用の通知

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

トランザクション通知委任コミット

TRANSACTION_NOTIFY_ENLIST_MASK

TRANSACTION_NOTIFY_ENLIST_PREPREPARE

TRANSACTION_NOTIFY_MARSHAL

トランザクション通知プロモート

トランザクション通知_新しいプロモーション

TRANSACTION_NOTIFY_PROPAGATE_PULL

TRANSACTION_NOTIFY_PROPAGATE_PUSH

TRANSACTION_NOTIFY_TM_ONLINE

トランザクション通知コミットの最終化