将日志流与 KTM 配合使用

基于 KTM 的事务处理系统 (TPS) 应使用 通用日志文件系统 (CLFS) 记录事务活动。 KTM 为每个事务管理器对象创建日志流。 每个资源管理器都应创建自己的日志流。

为事务管理器对象创建日志流

当资源管理器调用 ZwCreateTransactionManager 时,必须指定 CLFS 日志流的名称。 如果指定的流不存在,KTM 将创建它。 如果流已存在, ZwCreateTransactionManager 将重新打开它。 KTM 将此日志流分配给事务管理器对象。

KTM 使用事务管理器对象的日志流来记录有关事务管理器对象以及与事务管理器对象关联的所有资源管理器对象、事务对象和登记对象的内部状态信息。 如果事务操作在完成之前中断,KTM 可以使用日志中的信息来确定是提交还是回滚事务。

KTM 不会记录资源管理器从客户端接收或发送到客户端的事务数据。 资源管理器必须使用自己的日志流来记录此信息。

资源管理器可以调用 ZwQueryInformationTransactionManager 来获取有关事务管理器对象的日志流的信息,例如日志流的路径名称或 KTM 分配给流的 GUID。

为资源管理器创建日志流

在其初始化代码中,每个资源管理器应调用 ClfsCreateLogFile 来创建自己的日志流。 每个资源管理器都应使用其流来记录提交、回滚或恢复事务数据所需的事务的所有信息。

KTM 和 TPS 的所有资源管理器都可以使用单个日志文件,但每个 TPS 组件必须在日志文件中使用不同的流。 有关如何在日志文件中指定单个流的信息,请参阅 ClfsCreateLogFile

KTM 定期在事务管理器的日志流中创建 重启区域 。 当 KTM 执行恢复操作时,它会读取最后一个重启区域,以恢复在系统关闭之前打开的对象的状态。 同样,资源管理器应定期在其日志流中创建重启区域。 例如,每次完成事务操作时,资源管理器可能会创建一个重启区域。

有关 CLFS 日志流中重启区域的详细信息,请参阅 从 CLFS 流读取重启记录。 另请参阅 ClfsWriteRestartAreaClfsReadRestartAreaClfsReadPreviousRestartArea 例程。

使用日志流进行恢复

在资源管理器调用 ZwCreateTransactionManager 后,它必须调用 ZwRecoverTransactionManagerZwRecoverTransactionManager 例程读取事务管理器对象的日志流,以将 TPS 的状态恢复到已知的良好点。 如果在上次加载资源管理器后计算机正确关闭或未关闭,则日志流包含的信息最少。 如果发生系统崩溃,日志流将包含足够的恢复信息,以将所有事务还原到已知状态。

在资源管理器调用 ZwCreateResourceManager 后,它必须调用 ZwRecoverResourceManagerZwRecoverResourceManager 例程尝试恢复与每个资源管理器的登记关联的事务。 有关如何恢复资源管理器事务的详细信息,请参阅 处理恢复操作

存储事务数据

使用 CLFS 日志流的资源管理器应将事务数据存储在 CLFS 封送区域中。 CLFS 定期将数据从日志流的封送区域移动到永久存储介质。 若要记录修改数据的操作,资源管理器可能会执行以下操作:

  1. 在写入操作修改原始数据之前,将其复制到封送区域。

  2. 在不修改数据库的永久存储介质的情况下,对数据副本执行操作。

  3. 将新数据复制到封送区域。

如果资源管理器收到回滚通知,它可以从日志流还原原始数据。 如果收到提交通知,资源管理器可以将修改后的数据从日志流复制到数据库的永久存储介质。

资源管理器还可以使用 ZwSetInformationEnlistment 例程将恢复信息存储在登记对象中。 KTM 将此信息保存在其日志流中,并在恢复操作期间从日志流中读取此信息。 因此,资源管理器可以随时通过调用 ZwQueryInformationEnlistment 获取此恢复信息。