处理回滚操作

如果资源管理器、事务客户端或 KTM 确定该事务不得提交 (通常是因为) 检测到错误,则它可以回滚事务。

若要回滚事务,资源管理器可以调用 ZwRollbackEnlistment。 在资源管理器调用 ZwCreateEnlistment 以在事务中登记后,它可以在调用 ZwPrepareComplete 之前随时回滚该事务。

事务客户端可以通过调用 ZwRollbackTransaction 回滚其事务。 事务客户端调用 ZwCreateTransaction 创建事务后,它可以在调用 ZwCommitTransaction 之前随时回滚事务。

此外,事务客户端可以通过调用 ZwSetInformationTransaction 为事务设置超时值。 如果事务未在指定的时间量前提交,KTM 将回滚该事务。

调用 ZwRollbackEnlistmentZwRollbackTransaction 时,或者超过超时值时,KTM 会向所有资源管理器发送TRANSACTION_NOTIFY_ROLLBACK 通知

当每个资源管理器收到TRANSACTION_NOTIFY_ROLLBACK通知时,它必须执行以下操作:

  1. 将事务的数据还原到资源管理器在事务中登记之前的状态。

    通常,资源管理器通过将事务保存的初始数据从日志流复制到数据库的公共永久存储来还原事务的数据。 有关如何使用日志流的详细信息,请参阅 将日志流与 KTM 配合使用

  2. 调用 ZwRollbackComplete

调用 ZwRollbackComplete 后,资源管理器应调用 ZwClose 以关闭登记句柄。

如果资源管理器启动了回滚操作,它必须使用其客户端接口来通知客户端事务失败。