XA强一致性分布式事务原理

X/Open DTP模型与XA规范

        X/OPen DTP模型是X/Open组织定义的分布式事务标准规范,这个规范定义了分布式事务处理的一整套规范和API,具体的实现由各厂商复制

DTP模型

        DTP模型主要定义了3个核心组件,分别是应用程序、资源管理器和事务管者之间的关系

  • 应用程序用于定义事务边界,即定义事务的开始和结束,并且在事务边界进行操作
  • 资源管理器也称为事务参与者,如数据库、文件系统等,并提供访问资源的方式
  • 事务管理器也称为事务协调者,负责分配事务唯一标识,监控事务的执行进度,并且负责事物的提交、回滚操作

XA规范

  • xa_start: 负责开启或恢复一个事务分支,并且管理 XID 到调用线程
  • xa_end:负责取消当前线程与事务分支的关联
  • xa_prepare:负责询问资源管理器是否准备好提交事务分支
  • xacommit:负责通知资源管理器提交事务分支
  • xa rollback:负责通知资源管理器回滚事务分支
  • xa recover:负责列出需要恢复的 XA 事务分支

JTA规范

        JTA (Java Transaction API)为J2EE平台提供了分布式事务服务的能力。JTA规范是XA规范的 Java 版,即把XA 规范中规定的DTP 模型交互接口抽象成Java接口中的方法并规定每个方法要实现什么样的功能

JTA定义的接口如下

  • javax.transaction.TransactionManager: 事务管理器,负责事务的begin、commit.

rollback 等命令

  • javax.transactionUserTransaction:用于声明一个分布式事务
  • javax.transaction.TransactionSynchronizationRegistry: 事务同步注册
  • javax.transaction.xa.XAResource: 定义资源管理器提供给事务管理器操作的接口
  • javax.transaction.xa.Xid: 事务XID 接口

        事务管理器提供者: 实现 UserTransaction、 TransactionManager、 Transaction、TransactionSynchronizationRegistry、Synchronization、XID 接口,通过与 XAResource 接口交互实现分布式事务

        资源管理器提供者:XAResource 接口需要由资源管理器实现,该接口中定义了一些方法,这些方法会被事务管理器调用

  • start方法:开启事务分支,对应XA 底层实现是XA START
  • end 方法: 结束事务分支,对应 XA 底层实现是 XA END
  • prepare 方法:准备提交分支事务,对应XA 底层实现是XAPREPARE
  • commit方法:提交分支事务,对应XA 底层实现是XA COMMIT
  • rolback 方法:回滚分支事务,对应XA 底层实现是 XA ROLLBACK
  • recover方法:列出所有处于PREPARED状态的事务分支,对应XA底层实XA RECOVER

XA两阶段提交

        XA 二阶段提交一提到分布式事务,总会出现二阶段这个词,什么是二阶段,什么是 XA 的二阶段提

        一阶段:执行 XA PREPARE 语。事务管理器通知各个资源管理器准备提交它们的事交呢?事务分支。资源管理器收到通知后执行 XA PREPARE 语句。

        二阶段:执行XA COMMIT/ROLLBACK 语句。事务管理器根据各个资源管理器的XAPREPARE 语句执行结果,决定是提交事务还是回滚事务。如果所有的资源管理器都预提交成功,那么事务管理器通知所有的资源管理器执行 XA 提交操作;如果有资源管理器的XAPREPARE 语句执行失败,则由事务管理器通知所有资源管理器执行 XA 回滚操作

Mysql对XA规范的支持

        MySQL从5.0.3 版本开始支持XA分布式事务,且只有ImoDB存储引警支持MySQL Connector/J 从 5.0.0 版本开始直接提供对 XA 的支持。需要注意的是,在DTP模型中,MSOL 属于资源管理器,而一个完整的分布式事务中一般会存在多个资源管理器,由事务管理器来统一协调。因此,这里所说的 MySQL 对XA 分布式事务的支持,一般指的是单台MySOL实例如何执行自己的事务分支。可以执行如下命令来查看 MySQL对XA分布式事务的支持情况

Mysql XA事务的语法

  • XA (STARTBEGIN) xid [JOIN RESUME] : 开启 A事务,意如果使用的是XASTARI,那么不支持[JOIN|RESUME] 语句。
  • XA END xid [SUSPEND [FOR MIGRATE]]: 结束一个XA事务,不支持 SUSPEND

IFOR MIGRATE]]语句。

  • XA PREPARE xid:准备提交 XA 事务(如果使用了一阶提交,该过可以省略).
  • XA COMMIT xid [ONE PHASE]: 提交XA 事务。
  • XA ROLLBACK xid:回滚XA 事务。
  • XA RECOVER[CONVERT XID]: 列出所有处于 Prepare 阶段的XA事务

MySQL XID 详解

        在Mysql的事务语法中,最后都会跟随XID,对于Mysql来说,XID作为一个事务分支的标识符,事实上XID作为事务分支标识符在XA规范中被定义        

我们可以看到,在XID 中有4个字段、下面分别解释

  • formatlD: 记录 gtrid、bqual的格式,类似 Memcached 中 flags 字段的作用。XA范中通过一个结构体约定了XID 的组成部分,但没有规定 data 中存储的 gtrid、bqual的容应该是什么格式
  • gtrid length:全局事务标识符 (Global Transaction Identifier),最大不能超过64个字节
  • bqual length:分支限定符 (Branch Qualifier),最大不能超过 64 字节
  • data: XID 的值,即gtrid 和 bqual 拼接后的内容。在XID 的结构体中,没有gti和bqual,只有 gtrid length、bqual length。由于二者的内容都存储在 data 中,因此我们以根据 data 反推出 gtrid 和 bqual。举例来说,假设 gtrid 为 abc,bqual为 def,那么gtridlength=3,bqual _length=3,data=abcdef。反推的时候,从 data[0] 到 datagtrid length-l之间的部分就是gtrid的值,从 data[gtrid_length]到 data[gtrid length+bqual length一l]部分就是 bqual 的值

Mysql XA事务的状态

        Mysql XA 事务状态是正确执行XA事务的关键,每次执行Mysql XA事务语句都会修改XA事务的状态,进而执行不同的XA语句

  • 在XA START和XA END 之间执行的是业务 SQL 语,无论是否执行成功,都应该执行 XA END 语句。
  • 在IDLE状态下的事务可以直接执行XA COMMIT,这里我们可以这样理解,当只有一个资源管理器的时候,可以直接退化成一阶段提交。
  • 只有状态为 Failed 的时候,才能执行 XA ROLLBACK 进行XA事务回滚。
  • XA 事务和非XA 事务 (即本地事务) 是互斥的。例如,已经执行了XASTART命令来开启一个 XA 事务,则本地事务不会被启动,直到 XA 事务被提交或回滚为止。相反的,如果已经使用 START TRANSACTION 启动了一个本地事务,则XA 语句不能被使用,直到该事务被提交或回滚为止

XA 规范的缺陷

  • 同步阻塞:为了将单个事务的ACID提升到分布式事务的范畴,只能将可重复读隔离级别调整到串行化,这样执行效率则会是最低
  • 单点故障:两阶段提交的第二个阶段,如果协调者发生复故障,那么所有的参与者将都处于锁定事务资源的状态,无法继续完成事务操作
  • 数据不一致:协调者出现故障,部分参与者接收到了commit请求,部分执行部分不执行,将出现数据不一致情况
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值