创建高级事务管理器

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

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

何时创建高级事务管理器

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

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

如何创建高级事务管理器

如果希望组件成为出色的事务管理器,它必须执行以下操作:

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

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

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

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

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

为了回滚高级登记,高级事务管理器调用 ZwRollbackEnlistment

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

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

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

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