『』分布式事务如何实现?深入解读 Seata 的 XA 模式


作者简介:煊檍 , GitHub ID:sharajava , 阿里巴巴中件间 GTS 研发团队负责人 , SEATA 开源项目发起人 , 曾在 Oracle 北京研发中心多年 , 从事 WebLogic 核心研发工作 。 长期专注于中间件 , 尤其是分布式事务领域的技术实践 。
Seata 1.2.0 版本重磅发布新的事务模式:XA 模式 , 实现对 XA 协议的支持 。
这里 , 我们从三个方面来深入解读这个新的特性:

  • 是什么(What):XA 模式是什么?
  • 为什么(Why):为什么支持 XA?
  • 怎么做(How):XA 模式是如何实现的 , 以及怎样使用?
1. XA 模式是什么?
这里有两个基本的前置概念:
  1. 什么是 XA?
  2. 什么是 Seata 定义的所谓 事务模式?
基于这两点 , 再来理解 XA 模式就很自然了 。
1.1 什么是 XA?
XA 规范 是 X/Open 组织定义的分布式事务处理(DTP , Distributed Transaction Processing)标准 。
XA 规范 描述了全局的事务管理器与局部的资源管理器之间的接口 。XA规范 的目的是允许的多个资源(如数据库 , 应用服务器 , 消息队列等)在同一事务中访问 , 这样可以使 ACID 属性跨越应用程序而保持有效 。
XA 规范 使用两阶段提交(2PC , Two-Phase Commit)来保证所有资源同时提交或回滚任何特定的事务 。
XA 规范 在上世纪 90 年代初就被提出 。 目前 , 几乎所有主流的数据库都对 XA 规范 提供了支持 。
1.2 什么是 Seata 的事务模式?
Seata 定义了全局事务的框架 。
全局事务 定义为若干 分支事务 的整体协调:
  1. TM 向 TC 请求发起(Begin)、提交(Commit)、回滚(Rollback)全局事务 。
  2. TM 把代表全局事务的 XID 绑定到分支事务上 。
  3. RM 向 TC 注册 , 把分支事务关联到 XID 代表的全局事务中 。
  4. RM 把分支事务的执行结果上报给 TC 。 (可选)
  5. TC 发送分支提交(Branch Commit)或分支回滚(Branch Rollback)命令给 RM 。

『』分布式事务如何实现?深入解读 Seata 的 XA 模式
本文插图
Seata 的 全局事务 处理过程 , 分为两个阶段:
  • 执行阶段 :执行 分支事务 , 并 保证 执行结果满足是可回滚的(Rollbackable)和持久化的(Durable) 。
  • 完成阶段: 根据 执行阶段 结果形成的决议 , 应用通过 TM 发出的全局提交或回滚的请求给 TC , TC 命令 RM 驱动 分支事务 进行 Commit 或 Rollback 。
Seata 的所谓 事务模式 是指:运行在 Seata 全局事务框架下的 分支事务 的行为模式 。 准确地讲 , 应该叫作 分支事务模式 。
不同的 事务模式 区别在于 分支事务 使用不同的方式达到全局事务两个阶段的目标 。 即 , 回答以下两个问题:
  • 执行阶段 :如何执行并 保证 执行结果满足是可回滚的(Rollbackable)和持久化的(Durable) 。
  • 完成阶段: 收到 TC 的命令后 , 如何做到分支的提交或回滚?
以我们 Seata 的 AT 模式和 TCC 模式为例来理解:
AT 模式
『』分布式事务如何实现?深入解读 Seata 的 XA 模式
本文插图
  • 执行阶段:
    • 可回滚:根据 SQL 解析结果 , 记录回滚日志
    • 持久化:回滚日志和业务 SQL 在同一个本地事务中提交到数据库
  • 完成阶段:
    • 分支提交:异步删除回滚日志记录
    • 分支回滚:依据回滚日志进行反向补偿更新
TCC 模式