MySQL XA事务
MySQL从5.0.3开始支持分布式事务,当前的分布式事务只支持InnoDB存储引擎,在MySQL中,使用分布式事务的应用程序涉及一个或多个资源管理器和一个事务管理器。
- 资源管理器(Resource Manager):用于提供通向事务资源的途径,数据库服务器是一种资源管理器。该资源必须可以提交或回滚由RM管理的事务,例如,多态MySQL数据库作为多态资源管理器或者几台MySQL和几台Oracle作为资源管理器。
- 事务管理器(Transaction Manager):用于协调作为一个分布式事务的一部分的事务,TM与管理每个事务的RMs进行通信。在一个分布式事务中,各个单个事务均是分布式事务的“分支事务”。分布式事务和各分支通过一种命名方法进行标识。
用于执行分布式事务的过程使用两阶段提交协议,发生时间在由分布式事务的各个分支需要进行的行动已经执行之后。
- 在第一阶段,TM告知所有RM进行prepared操作,即所有RM被告知即将要执行commit操作,通常,这意味着用于管理分支的每个RM会记录对于被稳定保存的分支的行动,然后分支回答自己是否准备好进行commit操作了。
- 在第二阶段,TM告知所有RM进行commit或者回滚。如果在prepare时,有任一各RM回复说它无法进行commit操作,那么所有的RM将被告知进行回滚操作,否则所有的RM将被告知进行commit操作。
有些情况下,如果一个分布式事务只有一个RM,那么使用一阶段提交也可,即该RM会被告知同时进行prepare和commit操作。
XA事务语法
MySQL中与XA事务相关的SQL语句如下:
- XA {START|BEGIN} xid [JOIN|RESUME] #开始一个分布式事务
- XA END xid [SUSPEND [FOR MIGRATE]]
- XA PREPARE xid # 准备提交事务
- XA COMMIT xid [ONE PHASE] # 提交事务
- XA ROLLBACK xid #回滚事务
- XA RECOVER [CONVERT XID] # 查看处于PREPARE状态的事务
XID标识一个分布式事务,其组成:
- xid: gtrid [, bqual [, formatID ]]
- gtrid:必须,为字符串,表示全局事务标识符
- bqual:可选,为字符串,默认是空串,表示分支限定符
- formatID:可选,默认值为1,用于标识由gtrid和bqual值使用的格式
接下来拙劣地演示下这些语句的用法:
有一个user表有两个分片,分别在3306端口和3307端口的mysql上,灰色会3306上的操作,黑色为在3307上的操作,现在要从用户user1转50给user2:
在两个节点上分别开启事务:
进行转账操作:
准备提交:
提交:
结果:
XA事务状态(STATE)
1. 发起XA START后,事务置于ACTIVE STATE
2. 对于一个置于ACTIVE STATE的事务,可以发起多条SQL进行业务操作,然后发起XA END,使事务置于IDLE STATE
3. 对于一个置于IDLE STATE的事务,你可以发起XA PREPARE 或者XA COMMIT ... ONE PHASE语句
- XA PREPARE置事务于PREPARE STATE,告诉MySQL准备提交事务,可以用XA RECOVER语句来查看所有处于PREPARE STATE的事务
- XA COMMIT ... ONE PHASE告诉MySQL准备并提交(两个操作一起)事务
4. 对于一个置于PREPARE STATE的事务,可以发起XA COMMIT操作提交事务,或者发起XA ROLLBACK操作回滚事务
XA事务与LOCAL事务(LOCAL事务指非分布式事务,即以start transaction开始,以commit/rollback结束的事务),是互斥的,我们不能在一个LOCAL事务中间开启一个XA事务:
反之亦然:
问题
之前看到书上说:MySQL的分布式事务是不完整的。如果分支事务在达到prepare状态时,数据库异常重新启动,重启后,可以继续对分支事务进行提交和回滚操作,但是提交的事务不会写入binlog,会导致:1.使用binlog恢复时丢失部分数据;2.如果存在slave,那么会导致slave和当前节点数据不一致的现象。我用5.7的MySQL试了一下,发现并不存在这个问题,主从依然能同步,不知道哪个版本开始修复了这个问题
相关推荐
MySQL执行XA MySQL时,MySQL服务器相当于一个用于管理全局事务中的XA事务的资源管理器。与MySQL服务器连接的客户端相当于事务管理器。从5.1版本开始支持
主要介绍了mysql跨库事务XA操作,结合实例形式分析了php+mysql实现跨库事务XA操作具体操作步骤与相关注意事项,需要的朋友可以参考下
MySQL 外部XA及其在分布式事务中的应用分析,何登成出品
Mysql事务控制(XA分布式事务)和锁定语句
如果您在非标准位置具有MySQL标头和库(并且在PATH找不到mysql_config ),则可以使用--with-mysql-includes和--with-mysql-libs选项显式指定它们./configure 。 要编译不支持MySQL的SysBench,请使用--without-...
XA事务支持限于InnoDB存储引擎,本文将详细介绍mysql的XA事务恢复过程
近日,腾讯云发布了分布式数据库解决方案(DCDB),其最明显的特性之一就是提供了高于开源分布式事务XA的性能。大型业务系统有着用户多、并发高的特点,在这方面,集中式数据库(单机数据库)的性能很难支持,因此...
MySQL XA、Java事务API、atomikos等等,都是基于该规范做的实现。
7.11.1内部XA事务307 7.11.2外部XA事务308 7.12查询缓存309 7.12.1MySQL如何判断缓存命中309 7.12.2查询缓存如何使用内存311 7.12.3什么情况下查询缓存能发挥作用313 7.12.4如何配置和维护查询缓存316 7.12.5...
2. 两段提交的强一致性事务,高并发下,支持读已提交的事务隔离级别,数据一致性100%接近mysql xa。 3. 性能超过seata AT模式,由于事务拆分成多个,变成了几个小事务,压测发现比mysql普通事务更少发生死锁。 4. ...
析一般分布式事务处理失败的原因, 给出基于XA接口的MySQL( 关系型数据库管理系统) 和 PHP( 超级文本预处理语言) 对分布式事务处理的实现方法和过程. 研究结果表明, 该分布式事务 处理方法可靠, 并可简化程序的实现.
myeclipse开发,导入即可用,可以参阅http://www.cnblogs.com/shamo89/p/7326718.html
13.4.7. XA事务 13.5. 数据库管理语句 13.5.1. 账户管理语句 13.5.2. 表维护语句 13.5.3. SET语法 13.5.4. SHOW语法 13.5.5. 其它管理语句 13.6. 复制语句 13.6.1. 用于控制主服务器的SQL语句 13.6.2. 用于控制从...
MySQL论坛上的MySQL社区支持 1.8. MySQL标准的兼容性 1.8.1. MySQL遵从的标准是什么 1.8.2. 选择SQL模式 1.8.3. 在ANSI模式下运行MySQL 1.8.4. MySQL对标准SQL的扩展 1.8.5. MySQL与标准SQL的...
13.4.7. XA事务 13.5. 数据库管理语句 13.5.1. 账户管理语句 13.5.2. 表维护语句 13.5.3. SET语法 13.5.4. SHOW语法 13.5.5. 其它管理语句 13.6. 复制语句 13.6.1. 用于控制主服务器的SQL语句 13.6.2. 用于控制从...
13.4. MySQL事务处理和锁定语句 13.4.1. START TRANSACTION, COMMIT和ROLLBACK语法 13.4.2. 不能回滚的语句 13.4.3. 会造成隐式提交的语句 13.4.4. SAVEPOINT和ROLLBACK TO SAVEPOINT语法 13.4.5. LOCK TABLES...
13.4.7. XA事务 13.5. 数据库管理语句 13.5.1. 账户管理语句 13.5.2. 表维护语句 13.5.3. SET语法 13.5.4. SHOW语法 13.5.5. 其它管理语句 13.6. 复制语句 13.6.1. 用于控制主服务器的SQL语句 13.6.2. 用于控制从...