事务通知

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,但他们还必须支持多阶段预准备、准备和提交通知。

以下列表包含资源管理器可以接收的所有通知:

TRANSACTION_NOTIFY_PREPREPARE
发送时:客户端调用 ZwCommitTransaction 且没有资源管理器支持单阶段提交,或者 如果高级事务管理器 调用 ZwPreprepareEnlistment

接收者:资源管理器。

收件人所需的操作:执行预准备操作,然后调用 ZwPrepareComplete。 (有关预准备操作的详细信息,请参阅 处理提交操作。)

限制: 资源管理器还必须支持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。

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并通过调用 ZwPrepareComplete 做出响应之后。

接收者:高级事务管理器。

收件人所需的操作:上级事务管理器应调用 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

接收者:高级事务管理器。

收件人所需的操作:高级事务管理器必须为登记调用 ZwCommitEnlistmentZwRollbackEnlistment

TRANSACTION_NOTIFY_COMMIT_REQUEST
发送时:客户端调用 ZwCommitTransaction。 如果高级事务管理器已为登记注册了此通知,KTM 会将TRANSACTION_NOTIFY_COMMIT_REQUEST发送给高级事务管理器 ,而不是 向资源管理器发送TRANSACTION_NOTIFY_COMMIT。

接收者:高级事务管理器。

收件人所需的操作:高级事务管理器调用 ZwCommitEnlistment

TRANSACTION_NOTIFY_REQUEST_OUTCOME
发送时:当事务处于准备状态时,资源管理器调用 TmRequestOutcomeEnlistment

接收者:高级事务管理器。

收件人所需的操作:高级事务管理器必须调用 ZwCommitEnlistmentZwRollbackEnlistment

未使用的通知

以下通知在 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