Mycat事物
# Mycat事物
Mycat目前(1.6)还没有对跨分片的事务强一致性支持,仅仅单库内部可以保证事务的完整性,如果跨库事务,在执行的时候任何分片出错,可以保证所有分片回滚,但是一旦应用发起 commit 指令,无法保证所有分片都成功,考虑到某个分片挂的可能性不大所以称为弱 XA。
# XA事务使用
Mycat 从 1.6.5 版本开始支持标准 XA 分布式事务,考虑到 MySQL 5.7 之前版本XA有bug,所以推荐最佳搭配 XA 功能使用 MySQL 5.7 版本。
Mycat 实现 XA 标准分布式事务,Mycat 作为XA 事务协调者角色,即使事务过程中 Mycat 宕机挂掉,由于 Mycat 会记录事务日志,所以 Mycat 恢复后会进行事务的恢复善后处理工作。考虑到分布式事务的性能开销比较大,所以只推荐在全局表的事务以及其他一些对一致性要求比较高的场景。
使用示例:
XA事务需要设置手动提交
set autocommit=0;
使用该命令开启 XA 事务
set xa=on;
执行相应的 SQL 语句部分,例如
insert into user(id, name, sex) values(007, '007','man');
提交或回滚事务
commit; rollback;
# 保证 Repeatable Read
Mycat 有一个特性,就是开事务之后,如果不运行 update/delete/select for update
等更新类语句SQL 的话,不会将当前连接与当前 session 绑定。如下图所示:
这样做的好处是可以保证连接可以最大限度的复用,提升性能。
但是,这就会导致两次 select 中如果有其它的在提交的话,会出现两次同样的 select 不一致的现象,即不能 Repeatable Read,这会让人直连 MySQL 的人很困惑,可能会在依赖 Repeatable Read 的场景出现问题。
解决办法是对 server.xml 的 system **配置strictTxIsolation=true
**的时候,会关掉这个特性,以保证 Repeatable Read,如下图所示: