XA事务与MySQL
2017-07-07 17:44
295 查看
XA规范主要定义了事务管理器TM,和资源管理器RM之间的接口
根据2PC的规范,将一次事务分割成两个阶段
1. prepare阶段
TM向所有RM发送prepare指令,RM接受到指令后执行数据修改和日志记录等操作,然后返回 可以提交/不可提交 给TM
(按照我的理解应该类似于MySQL在开启一个事务之后,只差最后的COMMIT或者ROLLBACK的状态)
2. commit阶段
TM接受到所有RM的prepare结果
如果有RM返回是 不可提交 或者超时,那么向所有RM发送ROLLBACK命令
如果所有RM都返回可以提交,那么向所有RM发送COMMIT命令
XA的异常情况处理
MySQL与XA事务的关系有两种情况
1. 内部XA
在使用innodb作为存储引擎,并且开启binlog的情况下,MySQL同时维护了binlog日志与innodb的redo log
为了保证这两个日志的一致性,MySQL使用了XA事务,由于只在单机上工作,所以被称为内部XA
2. 外部XA
就是一般谈论的分布式事务了
MySQL支持XA START/END/PREPARE/COMMIT这些sql语句,通过使用这些命令,我们是可以完成分布式事务的
状态转移图如下
(我有点不能理解的是,为什么一定需要XA END这个语句,直接XA PREPARE不行吗)
在MySQL5.7.7之前,XA事务是有bug的
如果有一个XA事务处于PREPARE状态
1. 如果连接关闭,或者MySQL服务器正常退出,这个事务会被回滚(但是根据XA规范,这个事务应该被保留)
2. 如果MySQL服务器被强制结束,在重启之后,用XA RECOVER命令可以看到这个事务,这个事务也可以被XA COMMIT所提交,但是相关的binlog记录会丢失,这样就会导致数据库引擎中的数据与binlog中的数据不一致 (参考资料)
这两个bug被提出了十年之久,终于在5.7.7中被修正了(第一个bug阿里自己也搞了个修正)
就目前来看,MySQL的XA事务现在做得还不错,应该是可用的
转至:http://www.cnblogs.com/stevenczp/p/6265686.html
相关文章推荐
- MySQL xa 事务局限性
- MySQL XA 事务支持调研
- mysql的XA事务恢复过程详解
- Mysql 第十日 字符集,XA事务,查询缓存
- 分布式事务 - MySQL外部XA事务
- XA事务与MySQL
- MySQL中的XA事务
- MySQL通过内部XA事务,保持了binlog与redo log之间数据一致性
- mysql的XA事务恢复过程详解
- 【转载】MySQL 外部XA及其在分布式事务中的应用分析
- mysql 事务
- MySQL与事务
- JTA (XA)事务和JDBC事务
- MYSQL集群与INNODB事务处理的对比总结
- 用新PHP插件实现MySQL为基础的事务
- Mysql | 事务&存储过程
- 让mysql支持事务
- mysql事务处理
- 消息中间件和JMS&XA分布式事务处理
- XA和编程式的事务代码解决!