创建高级事务管理器

在 KTM 中, 高级事务管理器 是为其参与的事务创建高级登记的资源管理器。 高级登记是一种登记,它授予资源管理器协调登记事务提交操作的能力。 换句话说,事务客户端或高级事务管理器都可以启动事务的预准备/准备/提交序列。

在资源管理器为事务创建高级登记后,KTM 将拒绝对事务的 ZwCommitTransaction 的所有调用。 因此,事务客户端无法提交此类事务。 相反,创建高级登记的资源管理器必须调用 ZwPrepareEnlistmentZwPrepareEnlistmentZwCommitEnlistment

何时创建高级事务管理器

假设你想要将事务处理系统 (TPS) 组件与 KTM 集成,但该组件包含客户端可以调用的自己的非 KTM 事务管理功能。 在这种情况下,可能需要创建高级事务管理器。

例如,假设组件提供了客户端用于创建和提交事务的自己的接口。 由于组件的客户端不会调用 KTM 来创建或提交事务,因此在将组件集成到基于 KTM 的 TPS 时,该组件必须成为高级事务管理器。

如何创建高级事务管理器

如果希望组件成为高级事务管理器,则必须执行以下操作:

  1. 调用 ZwCreateResourceManager 注册为资源管理器。

  2. 每当组件的客户端使用组件的客户端接口创建事务时,调用 ZwCreateTransaction

  3. 调用 ZwCreateEnlistment,设置ENLISTMENT_SUPERIOR标志,并指定ENLISTMENT_SUPERIOR_RIGHTS和ENLISTMENT_SUBORDINATE_RIGHTS访问标志。

  4. 当组件的客户端调用组件的客户端接口来提交事务时,调用 ZwPrepareEnlistment、ZwPrepareEnlistment 和 ZwCommitEnlistment

KTM 只允许每个事务进行一次高级登记。 其他资源管理器可以创建其他登记。 这些登记称为 从属登记, 因为它们无法启动提交操作。

若要回滚高级登记,高级事务管理器调用 ZwRollbackEnlistment

为了恢复高级登记,上级事务管理器调用 ZwRecoverEnlistment

当高级事务管理器提交、回滚或恢复事务时,KTM 会将 事务通知 发送到所有从属登记,以便他们可以参与。

包含高级事务管理器的 TPS 不能使用 单阶段提交操作

在恢复操作期间,如果 KTM 无法确定事务的结果,则会向上级事务管理器发送TRANSACTION_NOTIFY_RECOVER_QUERY通知。 作为响应,如果可以提交事务,则上级事务管理器必须调用 ZwCommitEnlistment ;如果事务应回滚,则必须调用 ZwRollbackEnlistment 。 如果上级事务管理器无法确定事务的结果,则在确定结果之前,它不应响应TRANSACTION_NOTIFY_RECOVER_QUERY通知。