阅读(4768) (14)

Mycat2 XA事务注意点

2021-09-08 10:42:05 更新

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即可自动恢复)