本文主要基于 MyCAT 1.6.5 正式版
1. 概述
2. XA 概念
3. MyCAT 代码实现
3.1 JDBC Demo 代码
3.2 MyCAT 开启 XA 事务
3.3 MyCAT 接收 SQL
3.4 MySQL 接收 COMMIT
3.4.1 单节点事务 or 多节点事务
3.4.2 协调日志
3.4.3 MultiNodeCoordinator
3.5 MyCAT 启动回滚 XA 事务
4. MyCAT 实现缺陷
4.1 协调日志写入性能
4.2 数据节点未全部 PREPARE 就进行 COMMIT
4.3 MyCAT 启动回滚 PREPARE 的 XA 事务
4.4 单节点事务未记录协调日志
4.5 XA COMMIT 部分节点挂了重新恢复后,未进一步处理
5. 彩蛋
RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表
RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
您对于源码的疑问每条留言都将得到认真回复.甚至不知道如何读源码也可以请教噢.
新的源码解析文章实时收到通知.每周更新一篇左右.
认真的源码交流微信群.
1. 概述
数据库拆分后,业务上会碰到需要分布式事务的场景.MyCAT 基于 XA 实现分布式事务.国内目前另外一款很火的数据库中间件 Sharding-JDBC 准备基于 TCC 实现分布式事务.
本文内容分成三部分:
XA 概念简述
MyCAT 代码如何实现 XA
MyCAT 在实现 XA 存在的一些缺陷
2. XA 概念
>
X/Open 组织(即现在的 Open Group )定义了分布式事务处理模型. X/Open DTP 模型( 1994 )包括:
应用程序( AP )
事务管理器( TM )
资源管理器( RM )
通信资源管理器( CRM )
一般,常见的事务管理器( TM )是交易中间件,常见的资源管理器( RM )是数据库,常见的通信资源管理器( CRM )是消息中间件,下图是 X/Open DTP 模型:
一般的编程方式是这样的:
配置 TM ,通过 TM 或者 RM 提供的方式,把 RM 注册到 TM.可以理解为给 TM 注册 RM 作为数据源.一个 TM 可以注册多个 RM.
AP 从 TM 获取资源管理器的代理(例如:使用 JTA 接口,从 TM 管理的上下文中,获取出这个 TM 所管理的 RM 的 JDBC 连接或 JMS 连接)
AP 向 TM 发起一个全局事务.这时,TM 会通知各个 RM.XID(全局事务 ID)会通知到各个 RM.
AP 通过 TM 中获取的连接,间接操作 RM 进行业务操作.这时,TM 在每次 AP 操作时把 XID(包括所属分支的信息) 传递给 RM,RM 正是通过这个 XID 关联来操作和事务的关系的.
AP 结束全局事务时,TM 会通知 RM 全局事务结束.开始二段提交,也就是 prepare - commit 的过程.
XA 协议指的是 TM(事务管理器)和 RM(资源管理器)之间的接口.目前主流的关系型数据库产品都是实现了 XA 接口的.JTA(Java Transaction API) 是符合 X/Open DTP 模型的,事务管理器和资源管理器之间也使用了 XA 协议. 本质上也是借助两阶段提交协议来实现分布式事务的,下面分别来看看 XA 事务成功和失败的模型图:
来源: http://www.suo.im/1RWcgZ