MySQL XA 事务支持调研
2015-01-18 20:18
417 查看
准备往DBScale中添加分布式事务支持,最合适的方案是使用XA事务。
以下是关于mysql xa事务的调研:
1. mysql xa事务的语法
主要有:
以下是关于mysql xa事务的调研:
1. mysql xa事务的语法
主要有:
XA START 'any_unique_id'; // 'any_unique_id' 是用户给的,全局唯一 在一台mysql中开启一个XA事务 XA END 'any_unique_id '; 标识XA事务的操作结束 XA PREPARE 'any_unique_id'; 告知mysql 准备提交这个xa事务 XA COMMIT 'any_unique_id'; 告知mysql提交这个xa事务 XA ROLLBACK 'any_unique_id'; 告知mysql回滚这个xa事务 XA RECOVER; 查看本机mysql目前有哪些xa事务处于prepare状态 2. XA事务恢复 如果执行分布式事务的mysql crash了,mysql 按照如下逻辑进行恢复: a. 如果这个xa事务commit了,那么什么也不用做 b. 如果这个xa事务还没有prepare,那么直接回滚它 c. 如果这个xa事务prepare了,还没commit, 那么把它恢复到prepare的状态,由用户去决定commit或rollback 当mysql crash后重新启动之后,执行“XA RECOVER;”查看当前处于prepare状态的xa事务,然后commit或rollback它们。 3. 使用限制 a. XA事务和本地事务以及锁表操作是互斥的 开启了xa事务就无法使用本地事务和锁表操作 mysql> xa start 't1xa'; Query OK, 0 rows affected (0.04 sec) mysql> begin; ERROR 1399 (XAE07): XAER_RMFAIL: The command cannot be executed when global transaction is in the ACTIVE state mysql> lock table t1 read; ERROR 1399 (XAE07): XAER_RMFAIL: The command cannot be executed when global transaction is in the ACTIVE state 开启了本地事务就无法使用xa事务 mysql> begin; Query OK, 0 rows affected (0.00 sec) mysql> xa start 'rrrr'; ERROR 1400 (XAE09): XAER_OUTSIDE: Some work is done outside global transaction b. xa start 之后必须xa end, 否则不能执行xa commit 和xa rollback 所以如果在执行xa事务过程中有语句出错了,你也需要先xa end一下,然后才能xarollback。 4. 注意事项 a. mysql只是提供了xa事务的接口,分布式事务中的mysql实例之间是互相独立的不感知的。 所以用户必须 自己实现分布式事务的调度器 b. xa事务有一些使用上的bug, 参考http://www.mysqlops.com/2012/02/24/mysql-xa-optimize.html 主要是 “MySQL数据库的主备数据库的同步,通过Binlog的复制完成。而Binlog是MySQL数据库内部XA事务的协调者,并且MySQL数据库为binlog做了优化——binlog不写prepare日志,只写commit日志。 所有的参与节点prepare完成,在进行xa commit前crash。crash recover如果选择commit此事务。由于binlog在prepare阶段未写,因此主库中看来,此分布式事务最终提交了,但是此事务的操作并未 写到binlog中,因此也就未能成功复制到备库,从而导致主备库数据不一致的情况出现。 而crash recover如果选rollback, 那么就会出现全局不一致(该分布式事务对应的节点,部分已经提交,无法回滚,而部分节点回滚。最终导致同一分布式事务,在各参与节点,最终状态不一致)” 参考的那篇blog中给出的办法是修改mysql代码,这个无法在DBScale中使用。 所以可选的替代方案是不使用 主从复制进行备份,而是直接使用xa事务实现同步写来作为备份。 转载请注明出自高孝鑫的博客
相关文章推荐
- MySQL xa 事务局限性
- MySQL 的 XA 模式下的主从复制问题
- mysql 存储引擎  和 事务
- Mysql对事务的支持
- Mysql | 事务&存储过程
- 让Mysql支持事务处理
- mysql支持事务
- [MySQL FAQ]系列 -- mysql是否支持跨库事务
- mysql表类型MyISAM和InnoDB区别(mysql 不支持事务解决)
- mysql对GIS的支持 & oracle 空间数据库说明
- 让mysql支持事务
- 正好整理了一下,自己做了个连接数据库的组件,支持SQLSERVER,ACCESS,ORACLE,FoxPro,MySql,IBM DB2,DBF等数据库,并且支持事务处理
- IE 对CSS2.1的支持
- MySql支持事务
- 启动64位 IIS 32位应用程序的支持
- 一个支持主从,事务以及连接池功能的mysql-proxy脚本
- Mysql | 事务&存储过程
- Mysql支持事务处理
- iPhone PC Suite上传铃声法(支持iPhone v1.1.1)
- Mysql事务问题调试了半天,居然是Mysql数据库类型为MyISAM的表不支持事务