您的位置:首页 > 数据库 > MySQL

MySQL XA 事务支持调研

2015-01-18 20:18 417 查看
准备往DBScale中添加分布式事务支持,最合适的方案是使用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事务实现同步写来作为备份。

转载请注明出自高孝鑫的博客
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: