Skip to main content

XA 事务

XA 协议是由 X/Open 公司于 1991 年发布的一套标准协议。XA 是 eXtended Architecture 的缩写,因此该协议旨在解决如何在异构系统中保证全局事务的原子性。

分布式事务处理模型

分布式事务处理(Distributed Transaction Processing,DTP)模型定义了一个标准化的分布式事务处理的体系结构以及交互接口。应用程序(Application Program,AP)能够访问由多个资源管理器(Resource Manager,RM)提供的资源。其中,每个资源管理器都具有独立性,且不必是同构的。全局事务的原子性由事务管理器来负责,各个模块的交互如下图所示。

XA

如图所示,在分布式事务处理模型中,OceanBase 数据库系统作为资源管理器,负责管理部分数据资源。为了与事务管理器进行交互,OceanBase 数据库提供了一套标准的 XA 协议接口。为了实现这些接口,OceanBase 数据库内部有一套子程序来保证每一个 XA 协议接口的外部语义的标准性。事务管理器通过调用接口来触发 OceanBase 数据库内部的子程序,子程序处理完毕后将结果返回给事务管理器,事务管理器将会根据返回的结果来进行下一步处理。

基本概念

在进一步了解分布式事务处理模型前,您需要了解以下基本概念:

  • 应用程序(application program,AP)

    应用程序定义了全局事务的边界,并指定了构成全局事务的相关数据访问操作。

  • 资源管理器(resource manager,RM)

    资源管理器管理了一个可共享的、可恢复的数据资源,例如传统的关系型数据库管理系统。当发生故障后,资源管理器可以将数据资源恢复到一致状态。OceanBase 数据库系统可以作为资源管理器。

  • 事务分支(branch)

    通常,一个全局事务将会访问多个资源管理器上的数据,该全局事务在某一个资源管理器上的执行可以看作该全局事务的一个分支(branch)。

  • 事务管理器(transaction manager,TM)

    事务管理器提供了用于指定事务边界的接口,并负责全局事务的提交和恢复。当一个全局事务涉及多个资源管理器,为了保证该全局事务提交的原子性,事务管理器采用两阶段提交协议。

原子性保证

当全局事务进入到提交阶段后,事务管理器将需要保证该全局事务的原子性。事务管理器采用了两阶段提交协议,主要流程如下:

  1. 准备阶段:事务管理器向该全局事务涉及的资源管理器发送准备请求,每个资源管理器收到准备请求后,将持久化本地 XA 事务分支的修改,待持久化成功后,将成功消息返回给事务管理器。在该阶段中,OceanBase 数据库系统将会持久化对应事务分支的 Redo 日志。
  1. 提交/回滚阶段:当收齐所有该全局事务涉及的资源管理器的成功响应后,事务管理器将向这些资源管理器发送提交请求;否则,发送回滚请求。当资源管理器收到提交或回滚请求后,提交或回滚对应的事务分支。在该阶段中,OceanBase 数据库系统将会根据请求的类型,为对应的事务分支持久化相应的日志。具体来说,如果是提交请求,则将持久化提交日志;如果是回滚请求,则将持久化回滚日志。在持久化结束后,释放该事务分支的资源。

紧耦合模式

在分布式事务处理模型中,可能存在多个资源管理器底层访问同一个数据库。因此,存在一个全局事务的多个事务分支访问同一个数据库。在这种情况下,如果将该全局事务设置为紧耦合模式,那么访问同一个数据库的多个事务分支将共享资源。也就是说,这些分支之间可以互相看见彼此的修改。在 OceanBase 数据库系统中,如果两个分支为紧耦合分支,那么这两个分支将共享锁资源。具体来说,当一个事务分支对某个数据项加锁之后,另一个事务分支便可以认为自己已对该数据项加锁。

优化机制

一阶段提交

如果某个全局事务访问的数据仅涉及一个资源管理器上的数据资源,那么该全局事务不必采用两阶段提交机制。具体来说,当某个全局事务进入到提交阶段后,如果 TM 端发现该全局事务仅访问了一个资源管理器上的数据,那么事务管理器可以向对应的资源管理器发送一阶段提交请求。如果该资源管理器为OceanBase数据库系统,收到一阶段提交请求后,便可以直接提交对应的事务分支,该请求处理结束后,OceanBase数据库系统可以释放事务持有的资源。当收到该一阶段提交请求的响应后,事务管理器便可以返回结果,不必向资源管理器再发送任何请求。

只读事务分支

对于某个全局事务,如果其涉及的某个资源管理器仅提供了读取服务,那么当该全局事务进入到提交阶段后,该资源管理器不需要为该全局事务持久化做任何的数据修改。当 OceanBase 数据库系统收到某个事务分支的准备请求后,如果发现该事务分支没有修改任何数据,那么可以返回一个特殊的响应消息,然后便可以释放该事务分支持有的资源。当事务管理器收到该特殊响应后,便可以知道该事务分支为只读事务分支,后续将不再向该资源管理器发送两阶段提交中的提交或回滚请求。