创建事务客户端

事务客户端是事务处理系统 (TPS) 组件,该组件使用资源管理器的导出接口访问资源管理器支持的资源(例如数据库)。

通常,客户端创建一个事务,执行一组数据库操作,然后提交该事务以使操作永久化。 如果客户端遇到错误,可以回滚事务以删除事务的操作,而不是提交事务。

通常,使用内核模式 KTM 的事务客户端必须为每个事务执行以下任务:

  1. 创建事务对象。

    调用 ZwCreateTransaction 会创建一个事务对象,提供一个对象句柄,并分配对象标识符 (GUID) 客户端可以传递给资源管理器以标识事务。

  2. 获取事务对象的标识符。

    客户端可以调用 ZwQueryInformationTransaction 来获取对象标识符。

  3. 将事务对象的标识符传递给资源管理器。

    客户端通常调用资源管理器的导出接口以打开与资源管理器的通信路径,并将该路径与事务相关联。 例如,资源管理器可能会提供 一个 CreateDataObject 例程,该例程类似于 了解 TPS 组件 主题所描述的例程。

  4. 执行要包含在事务中的操作。

    通常,客户端调用资源管理器的 接口来访问资源管理器的资源。 例如,数据库管理器的客户端可能会从数据库读取和写入数据库。

  5. 提交或回滚事务。

    如果所有资源操作都成功,客户端必须调用 ZwCommitTransaction 以使操作永久。 如果操作失败,客户端必须调用 ZwRollbackTransaction 而不是 ZwCommitTransaction。 例如,如果数据库管理器的客户端确定一系列写入操作之一失败,则客户端必须调用 ZwRollbackTransaction ,以便所有写入操作都不会永久。

    客户端可以同步或异步调用 ZwCommitTransactionZwRollbackTransaction 。 如果客户端以同步方式调用这些例程,则在提交或回滚操作完成之前,例程不会返回。

    有关如何提交和回滚事务的详细信息,请参阅 处理事务操作

  6. 关闭事务对象句柄。

    客户端完成事务处理后,必须调用 ZwClose 以关闭事务对象的句柄

TPS 可能包含多个资源管理器。 如果客户端的事务包括对多个资源(例如两个资源管理器支持的两个数据库)的操作,则客户端通常会执行以下操作:

  1. 为每个事务创建单个事务对象。

  2. 将事务对象的标识符传递给每个资源管理器。

  3. 通过调用每个资源管理器的接口在每个数据库上执行操作。

  4. 如果所有操作都已完成且未出错,则提交事务;如果检测到错误,则回滚事务。

如果 TPS 包含 高级事务管理器,则事务客户端通常不调用 KTM。 有关高级事务管理器及其客户端的详细信息,请参阅 创建高级事务管理器

事务客户端可以调用 ZwSetInformationTransaction 来设置特定于事务的信息。 例如,客户端可以为事务设置超时值或提供描述性字符串。 客户端可以调用 ZwQueryInformationTransaction 来检索有关事务的信息。 例如,客户端可以调用此例程来确定是否已提交或回滚事务。