社区&文档
分布式事务支持
阅读 Mycat权威指南 的 高级进阶篇-高可用与集群 和 高级进阶篇-事务支持 、博文及对应源码可知:
- Mycat可集群部署支持高可用,且基于HAProxy做软负载(Mycat定义为无状态中间件,可轻松集群)
- 单例Mycat支持弱XA事务(一旦应用发起 comit 指令,无法保证所有分片都成
功),无
Transaction Coordinator角色协调多个Mycat实例间全局事务。 - application端开启XA事务代码如下:
public class MyCATXAClientDemo {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
// 1. 获得数据库连接
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:8066/dbtest", "root", "123456");
conn.setAutoCommit(false);
// 2. 开启 MyCAT XA 事务
conn.prepareStatement("set xa=on").execute();
// 3. 插入 SQL
// 3.1 SQL1 A库
long uid = Math.abs(new Random().nextLong());
String username = UUID.randomUUID().toString();
String password = UUID.randomUUID().toString();
String sql1 = String.format("insert into t_user(id, username, password) VALUES (%d, '%s', '%s')",
uid, username, password);
conn.prepareStatement(sql1).execute();
// 3.2 SQL2 B库
long orderId = Math.abs(new Random().nextLong());
String nickname = UUID.randomUUID().toString();
String sql2 = String.format("insert into t_order(id, uid, nickname) VALUES(%d, %s, '%s')", orderId, uid, nickname);
conn.prepareStatement(sql2).execute();
// 4. 提交 XA 事务
conn.commit();
}
}
高可用方案:
XA事务执行流程:
结论
在全局事务方面,Mycat相当于加入了Autmikos(以三方包形式提供TM角色)依赖的普通application,未提供真正的跨application的全局事务,其“全局”体现在其管理了整个应用体系所有数据库可以跨库进行XA事务控制,即其相对普通application增强了数据库管理范围。
故Mycat不适用于微服务架构的跨application全局事务控制。
原创不易,觉得不错就点个赞以示鼓励吧!