MySQL XA规范

MySQL XA规范

Content #

提到 XA 规范,就不得不说 DTP 模型( Distributed Transaction Processing),因为 XA 规范约定的是 DTP 模型中 2 个模块(事务管理器和资源管理器)的通讯方式,那 DTP,就是分布式事务处理,就像下图的样子:

为了帮助你更好的理解 DTP 模型,我来解释一下 DTP 各模块的作用。

  1. AP:应用程序(Aplication Program),一般指事务的发起者(比如数据库客户端或者访问数据库的程序),定义事务对应的操作(比如更新操作 UPDATE executed_table SET status = true WHERE id=100)。

  2. RM:资源管理器(Resource Manager),管理共享资源,并提供访问接口,供外部程序来访问共享资源,比如数据库,另外 RM 还应该具有事务提交或回滚的能力。

  3. TM:事务管理器(Transaction Manager),TM 是分布式事务的协调者。TM 与每个 RM 进行通信,协调并完成事务的处理。

应用程序访问、使用资源管理器的资源,并通过事务管理器的事务接口(TX interface)定义需要执行的事务操作,然后事务管理器和资源管理器会基于 XA 规范,执行二阶段提交协议。

XA 规范约定了事务管理器和资源管理器之间双向通讯的接口规范,并实现了二阶段提交协议:

为了帮你更好地理解这个过程,咱们一起走下流程,加深下印象:

  1. AP(应用程序)联系 TM(事务管理器)发起全局事务;
  2. TM 调用 ax_open() 建立与资源管理器的会话;
  3. TM 调用 xa_start() 标记事务分支(Transaction branch)的开头;
  4. AP 访问 RM(资源管理器),并定义具体事务分支的操作,比如更新一条数据记录(UPDATE executed_table SET status = true WHERE id=100)和插入一条数据记录(INSERT into operation_table SET id = 100, op = ‘get-cdn-log’);
  5. TM 调用 xa_end() 标记事务分支的结尾;
  6. TM 调用 xa_prepare() 通知 RM 做好事务分支提交的准备工作,比如锁定相关资源,也就是执行二阶段提交协议的提交请求阶段;
  7. TM 调用 xa_commit() 通知 RM 提交事务分支(xa_rollback() 通知 RM 回滚事务),也就是执行二阶段提交协议的提交执行阶段;
  8. TM 调用 xa_close() 关闭与 RM 的会话。

你可以这么理解:xa_start() 和 xa_end() 在准备和标记事务分支的内容,然后调用 xa_prepare() 和 xa_commit()(或者 xa_rollback())执行二阶段提交协议,实现操作的原子性。在这里需要你注意的是,这些接口需要按照一定顺序执行,比如 xa_start() 必须要在 xa_end() 之前执行。

事务管理器对资源管理器调用的 xa_start() 和 xa_end() 这对组合,一般用于标记事务分支(就像上面的更新一条数据记录和插入一条数据记录)的开头和结尾。在这里,你需要注意的是:

  1. 对于同一个资源管理器,根据全局事务的要求,可以前后执行多个操作组合,比如,先标记一个插入操作,然后再标记一个更新操作。
  2. 事务管理器只是标记事务,并不执行事务,最终是由应用程序通知资源管理器来执行事务操作的。

另外,XA 规范还约定了如何向事务管理器注册和取消资源管理器的 API 接口(也就是 ax_reg() 和 ax_unreg() 接口)。在这里需要你注意的是,这两个接口是 ax_ 开头的,而不是像 xa_start() 那样是 xa_ 开头的,这是很容易误解的点。

Viewpoints #

From #

加餐 | MySQL XA是如何实现分布式事务的?