共用方式為


交易通知

KTM 會為每個資源管理員提供通知佇列。 KTM 會透過將通知放入資源管理員的佇列中來傳遞通知。

資源管理員可以同步或非同步地從其佇列擷取通知。

  • 若要同步擷取通知,資源管理員可以重複呼叫 ZwGetNotificationResourceManager

  • 若要以非同步方式接收通知,資源管理員可以呼叫 TmEnableCallbacks 來設定回呼常式。 KTM 每次將通知放入資源管理員佇列時都會呼叫回呼常式。

當資源管理員呼叫 ZwCreateEnlistment 來建立交易的登記時,資源管理員會指定它應該接收的通知類型。 資源管理員只會收到他們註冊接收的通知。

通知常數定義在 Ktmtypes.h 中。 通知常數名稱的格式為 TRANSACTION_NOTIFY_Xxx

本主題的其餘部分會列出 Ktmtypes.h 所定義的所有通知常數,並將它們分成三個群組:

  • 資源管理員可以接收的通知

  • 上級交易管理員可以接收的通知

  • 已定義但目前未使用的通知常數

資源管理員的通知

所有資源管理員都必須註冊以接收TRANSACTION_NOTIFY_PREPREPARE、TRANSACTION_NOTIFY_PREPARE和TRANSACTION_NOTIFY_COMMIT通知,即使他們隨後呼叫ZwReadOnlyEnlistment將註冊標記為唯讀。

資源管理員可以支援 TRANSACTION_NOTIFY_SINGLE_PHASE_COMMIT,但也必須支援多階段的預先準備、準備、和提交通知。

下列清單包含資源管理員可以接收的所有通知:

交易通知預準備
傳送時:用戶端會呼叫 ZwCommitTransaction ,而且沒有資源管理員支援單一階段認可,或 如果上層交易管理員 呼叫 ZwPrePrepareEnlistment

接收者:資源管理員。

收件者所需的動作:執行預先準備作業,然後呼叫 ZwPrePrepareComplete。 (如需預先準備作業的詳細資訊,請參閱 處理認可作業

限制: 資源管理員也必須支援TRANSACTION_NOTIFY_PREPARE和TRANSACTION_NOTIFY_COMMIT。

TRANSACTION_NOTIFY_PREPARE
傳送時:在TRANSACTION_NOTIFY_PREPREPARE之後,如果用戶端呼叫 ZwCommitTransaction ,且沒有資源管理員支援單階段提交,或上級交易管理員呼叫 ZwPrepareEnlistment

接收者:資源管理員。

收件者所需的動作: 執行準備作業,然後呼叫 ZwPrepareComplete。 (如需準備作業的詳細資訊,請參閱 處理認可作業。)

限制: 資源管理員也必須支援TRANSACTION_NOTIFY_PREPREPARE和TRANSACTION_NOTIFY_COMMIT。

TRANSACTION_NOTIFY_COMMIT
傳送時:在TRANSACTION_NOTIFY_PREPARE之後,如果用戶端呼叫 ZwCommitTransaction 且無資源管理員支援單相認可,或若上層交易管理員呼叫 ZwCommitEnlistment

接收者:資源管理員。

收件者所需的動作:執行認可作業,然後呼叫 ZwCommitComplete。 (如需認可作業的詳細資訊,請參閱 處理認可作業。)

㯻: 資源管理員也必須支援TRANSACTION_NOTIFY_PREPREPARE和TRANSACTION_NOTIFY_PREPARE。

交易通知單一階段提交
傳送時:用戶端會呼叫 ZwCommitTransaction ,而資源管理員支援單一階段認可作業。

接收者:資源管理員。

收件者所需的動作:認可交易或呼叫 ZwSinglePhaseReject。 (如需單階段認可作業的詳細資訊,請參閱 處理認可作業

限制: 資源管理員也必須支援 TRANSACTION_NOTIFY_PREPREPARE、TRANSACTION_NOTIFY_PREPARE 和 TRANSACTION_NOTIFY_COMMIT。

TRANSACTION_NOTIFY_ROLLBACK
傳送時:用戶端呼叫 ZwRollbackTransaction、上層交易管理員呼叫 ZwRollbackEnlistment,或 KTM 偵測到錯誤 (,例如寫入記錄資料流程失敗) 。

接收者:資源管理員和上級交易管理員。

收件者所需的動作:執行復原交易數據所需的任何作業,然後呼叫 ZwRollbackComplete。 (如需復原作業的詳細資訊,請參閱 處理復原作業

㯻: 所有資源管理員和上級交易管理員都必須支援TRANSACTION_NOTIFY_ROLLBACK。

交易通知恢復
傳送時:資源管理員會呼叫 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_ROLLBACK
請參閱先前的描述。

交易通知_RM_已斷開連線
請參閱先前的描述。

TRANSACTION_NOTIFY_PREPREPARE_COMPLETE
傳送時:在所有資源管理員收到TRANSACTION_NOTIFY_PREPREPARE並呼叫 ZwPrePrepareComplete 來回應之後。

接收者:高級交易經理。

收件者所需的動作:上級交易管理員應該呼叫 ZwPrepareEnlistment

交易通知準備完成
傳送時:在所有資源管理員收到TRANSACTION_NOTIFY_PREPARE並呼叫 ZwPrepareComplete 來回應之後。

接收者:高級交易經理。

收件者所需的動作:上層交易管理員應該呼叫 ZwCommitEnlistment

交易通知提交完成
傳送時:在所有資源管理員收到TRANSACTION_NOTIFY_COMMIT並呼叫 ZwCommitComplete 來回應之後。

接收者:資深交易管理者。

收件者所需的動作:交易清除作業。

交易通知回滾完成
傳送時:在所有資源管理員收到TRANSACTION_NOTIFY_ROLLBACK並呼叫 ZwRollbackComplete 進行回應之後。

接收者:高級交易經理。

收件者所需的動作:交易清除作業。

TRANSACTION_NOTIFY_RECOVER_QUERY
傳送時:上層交易管理員會呼叫 ZwRecoverResourceManager

接收者:高級交易經理。

收件者所需的動作:上層交易管理員必須呼叫 ZwCommitEnlistmentZwRollbackEnlistment 才能進行登記。

TRANSACTION_NOTIFY_COMMIT_REQUEST
傳送時:用戶端會呼叫 ZwCommitTransaction。 如果上層交易管理員已註冊此通知以進行登記,KTM 會將TRANSACTION_NOTIFY_COMMIT_REQUEST傳送至上層交易管理員, 而不是 將TRANSACTION_NOTIFY_COMMIT傳送至資源管理員。

接收者:高級交易經理。

收件者所需的動作:上層交易管理員會呼叫 ZwCommitEnlistment

交易通知請求結果
傳送時:資源管理員會在交易處於備妥狀態時呼叫 TmRequestOutcomeEnlistment

接收者:高級交易經理。

收件者所需的動作:上層交易管理員必須呼叫 ZwCommitEnlistmentZwRollbackEnlistment

未使用的通知

下列通知定義在 Ktmtypes.h 中,但 KTM 目前不支援它們:

TRANSACTION_NOTIFY_DELEGATE_COMMIT

TRANSACTION_NOTIFY_ENLIST_MASK

交易通知登記準備預處理

TRANSACTION_NOTIFY_MARSHAL

交易通知提升

交易通知促銷新條款

TRANSACTION_NOTIFY_PROPAGATE_PULL

交易_通知_傳播_推送

交易通知_TM_在線

交易_通知_提交_完成