处理恢复操作

恢复 操作中,事务处理系统 (TPS) 尝试从 日志流中的信息恢复其状态。 恢复操作完成后,所有事务都应处于已提交或回滚状态,并且所有资源数据都应处于已知的良好状态。

有时 TPS 在其所有事务完成之前停止。 例如,操作系统可能会崩溃。 因此,资源管理器必须在开始运行时启动恢复操作。 恢复操作会尝试确定是否有任何事务不完整。 如果在日志中发现不完整的事务,则恢复操作会尝试提交或回滚这些事务。

对于基于 KTM 的 TPS,每个恢复操作由两个步骤组成。 第一步涉及从事务管理器对象的日志流中恢复信息。 第二步涉及从资源管理器的日志流中恢复信息。

TPS 可以恢复到所有日志流的末尾,或者,如果其资源管理器维护 虚拟时钟值,它可以恢复到指定的时钟值。

从事务管理器对象的日志流中恢复信息

在资源管理器调用 ZwCreateTransactionManagerZwOpenTransactionManager 后,它必须立即调用 ZwRecoverTransactionManagerZwRecoverTransactionManager 例程读取属于事务管理器对象的日志流。 此例程重新构造事务管理器对象的状态, (包括从日志流中的恢复信息) 的所有事务、登记和资源管理器,从 KTM 创建的最后 一个重启区域 开始,并在流的末尾结束。

若要从上次重启区域恢复到指定的虚拟时钟值,资源管理器可以调用 ZwRollforwardTransactionManager 而不是 ZwRecoverTransactionManager

从资源管理器的日志流恢复信息

在资源管理器调用 ZwCreateResourceManagerZwOpenResourceManager 后,它必须立即调用 ZwRecoverResourceManagerZwRecoverResourceManager 例程尝试恢复与每个资源管理器的登记关联的事务。

当资源管理器调用 ZwRecoverResourceManager 时,KTM 会为每个资源管理器的登记发送TRANSACTION_NOTIFY_RECOVER 通知 。 资源管理器必须在每次收到其中一个TRANSACTION_NOTIFY_RECOVER通知时调用 ZwRecoverEnlistment

当资源管理器调用 ZwRecoverEnlistment 时,KTM 会发送以下通知之一:

  • TRANSACTION_NOTIFY_COMMIT

    资源管理器必须使用其日志流中的信息来提交事务,然后必须调用 ZwCommitComplete

  • TRANSACTION_NOTIFY_ROLLBACK

    资源管理器必须使用其日志流中的信息回滚事务,然后必须调用 ZwRollbackComplete

  • TRANSACTION_NOTIFY_INDOUBT

    KTM 尚未确定事务的状态,稍后将发送提交或回滚通知。

通常,如果 KTM 确定在 TPS 停止并重新启动之前所有名为 ZwPrepareComplete 的 资源管理器,则会发送TRANSACTION_NOTIFY_COMMIT通知。 如果 KTM 确定一个或多个资源管理器未调用 ZwPrepareComplete,则会发送TRANSACTION_NOTIFY_ROLLBACK通知。

KTM 为每个登记发送TRANSACTION_NOTIFY_RECOVER通知后,会发送TRANSACTION_NOTIFY_LAST_RECOVER通知。

如果资源管理器调用 了 ZwRollforwardTransactionManager 而不是 ZwRecoverTransactionManager,则它只能恢复到指定给 ZwRollforwardTransactionManager 的虚拟时钟值。

资源管理器可以调用 ZwSetInformationEnlistment 来设置自定义的恢复信息。 KTM 保存此信息并将其写入日志流,但 KTM 不会尝试解释该信息。 资源管理器可以随时通过调用 ZwQueryInformationEnlistment 来检索恢复信息。

高级事务管理器 有时会在恢复操作期间收到TRANSACTION_NOTIFY_RECOVER_QUERY通知。