mysql xa协议解析

背景:

在日常开发中,为了保证数据的原子性、一致性和隔离性等特性,需要使用事务来控制SQL语句的执行和提交。例如在一个单元操作中,对一个数据库的多个表进行了一系列的增删改,为了保证多个表能够一致性的修改数据,同时不受其他mysql连接操作的影响,就需要使用事务。

对于单个数据库,可以直接使用mysql的事务进行事务控制,通过begin,commit和rollback等操作进行开启、回滚或提交事务。但是更加复杂的应用中,通常会出现同时修改多个数据源数据的情况,为了保证这些数据的能够受事务的控制,就需要分布式事务的帮助了,而xa协议则是分布式事务需要实现的协议。

xa事务介绍

xa支持分布式事务,通过xa事务可以允许多个数据源加入到一个全局事务中来,加入事务中的资源通常是关系数据库,也有可能是其他数据资源。

在一个全局事务中,包含多个数据操作的动作,这些动作在全局事务中要么全部执行,要么全部不执行,一个使用全局事务的应用包含一个或者多个资源管理器和一个事务管理器:

  1. 资源管理器RM(resource manager):提供连接事务资源的的功能。一个数据库服务器就是一种资源管理器。资源管理器是事务的参与者,必须要提供提交和回滚事务的功能
  2. 事务管理器TM(transaction manager):事务管理器是全局事务的协调者,他通过与资源管理器通信,协调多个事务的运作。

mysql通过实现xa协议,处理xa事务,让自身成为全局事务中的一个资源管理器。一个连接到mysql服务器的客户端则充当一个事务管理器的角色。实现全局事务,需要知道那些参与者参与到事务中,如何将他们运行到一个可以共同提交,或者回滚的点。作为全局事务,还需要考虑网络连接等因素导致的失败。

执行全局事务的过程是通过two-phase commit (2PC)实现的:

  1. 在第一阶段,所有参与者分支准备完毕。该阶段中,事务管理器告诉所有参与者准备进行提交。这意味着每个资源管理器都需要记录自身对于存储内容的操作,每个参与者稿子事务管理器他们是否能够执行这些操作,这些结果将在第二阶段中使用;
  2. 在第二阶段,事务管理器告知所有参与者进行提交或者回滚操作。如果所有参与者在第一步中都表明可以进行提交,则事务管理器通知所以参与者提交事务;如果其中的一个参与者表明需要回滚,则所有参与者进行回滚。

下图展示了两阶段提交的逻辑:

 

在一些情况下,全局事务可能使用一阶段提交,例如事务管理器发现全局事务中只有一个数据源,该数据源会被告知准备提交和提交一起进行。

xa事务语法

xa事务的语法如下:

XA {START|BEGIN} xid [JOIN|RESUME]  //开始xa事务,xid为一个唯一的全局id

XA END xid [SUSPEND [FOR MIGRATE]]  //xa事务的操作结束,接下来进行两阶段提交

XA PREPARE xid   //为xid全局事务做准备,如果全部成功则commit,否则rollback

XA COMMIT xid [ONE PHASE]  //提交事务

XA ROLLBACK xid  //回滚事务

XA RECOVER [CONVERT XID]  //释放xid

xa事务状态

一个xa事务在进行过程中,会有以下状态:

  1. 通过xa start开始一个新的xa事务,这时事务处于激活状态(ACTIVE state);
  2. 对于已经激活的xa事务,输入SQL语句构成事务的操作内容,然后输入xa end 语句,xa end语句让事务变成静止状态(IDLE state),改装天代表xa事务的SQL语句已经结束;
  3. 对于静止状态的xa事务,可以输入xa prepare语句或者xa commit进行一阶段的提交。xa prepare让事务进入准备状态(PREPARED state)。此时如果输入xa recover语句,将输出事务的xid值,因为xa recover将所有在准备状态的xa事务展示出来。xa commit让事务一阶段进行提交,再输入xa recover之后,该事务的xid将不会被展示出来;
  4. 对于准备状态的xa协议,可以使用xa commit语句提交并结束该事务,或者使用xa rollback回滚并终止该事务。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值