Mycat2 XA事务注意点
Mycat2事务基于Vertx的异步SQL接口构建,但是其实现是自研的mysql协议实现
Mycat2在只涉及一个数据库的事务不会开启XA事务,在涉及多个数据库的事务才会开启XA事务。
对于非MySQL
数据源,Mycat2不会在启动的时候执行XA RECOVER
.不能使用XA事务,请在配置中把事务设置为proxy
类型
业务冲突
暂时 Mycat2 缺 XA 死锁检查,实现该功能需要改动MySQL的源码,所以业务代码添加全局锁或者梳理事务代码来避免XA死锁。
异常情况
在Mycat没有出现异常关闭的情况下,在设计上,正常使用是不需要人工XA事务恢复的,仅仅在Mycat出现异常关闭,而且Mycat再次启动的时候无法恢复XA事务的情况下才需要人工参与恢复.
1.15
开始支持MySQL XA事务,事务日志表会在Mycat2启动时候在存储节点上建立mycat.xa_log
表.
它记录已经进入commit
节点事务,在此表有记录的分布式事务都是要提交的,而不在此表的XA PREPARE
阶段事务是要回滚的.mycat.xa_log
表的记录是事务已经进入commit
阶段但是没有执行完成的依据.
如果访问某存储节点的sql阻塞,有可能是XA PREPARE
阶段的事务没有被COMMIT
或者ROLLBACK
.Mycat在启动的时候会根据XA RECOVER
语句,可以得到mysql上存在的PREPARE
阶段事务,然后检查每个存储节点数据库的mycat.xa_log
如果有该对应的xid
,则会自动执行XA COMMIT 'xxxx'
补上commit
,如果没有,则补上XA ROLLBACK 'xxx'
回滚.这两个操作成功执行后都会删除mycat.xa_log
中的xid
记录
XA
第一个XA COMMIT
前会补上一个日志记录,注意的是,插入日志的SQL与第一个连接处于同一个事务,当此COMMIT
成功,则日志记录可查,即使往后的其它节点COMMIT
失败也可以根据此记录得知已经COMMIT
了.如果找不到此记录,则说明第一个XA COMMIT
失败,那么此XID
的其它的XA PREPARE
都需要回滚.所有节点XA COMMIT
或者XA ROLLBACK
后删除日志记录.
如果上述过程没有生效,则需要人工执行(一般重起Mycat2即可自动恢复)