MYSQL中的XA事务
- 写在前面
- 1. XA事务的基本原理
- 2. MySQL XA事务操作
写在前面
MySQL 的 5.0.3 版本开始支持XA分布式事务,并且只有innoDB存储引擎支持XA事务。
1. XA事务的基本原理
XA事务本质上是一种基于两阶段提交的分布式事务,分布式事务可以理解成多个数据库事务共同完成一个原子性的事务操作。参与操作的多个事务要么全部提交成功,要么全部提交失败。
XA事务支持不同数据库之间实现分布式事务。这里的不同数据库,可以是不通的MySQL实力,也可以是不同的数据库类型,比如MySQL数据库和sqlite数据库或者是oracle数据库。
XA事务由一个事务管理器、一个或者多个资源管理器和一个应用程序组成。
- 事务管理器:主要对参与全局事务的各个分支事务进行协调,并与资源管理器进行通讯
- 资源管理器:主要提供对事务资源的访问能力,可以把一个数据库看作一个资源管理器
- 应用程序:主要用来明确全局事务和各个分支事务,指定全局事务中的各个操作
因为XA事务是基于两阶段提交的分布式事务,所以XA事务也被拆分为Prepare阶段和Commit阶段。
- 在Prepare阶段,事务管理器向资源管理器发送准备指令,资源管理器接受到指令后,执行数据的修改操作并记录相关日志信息,然后向事务管理器返回可以提交或者不可以提交的结果信息。
- 在Commit阶段,事务管理器接受所有资源管理器返回的结果信息,如果某一个或多个资源管理器向事务管理器返回的结果信息为不可以提交,或者超时,则事务管理器向所有资源管理器发送回滚指令。
- 如果事务管理器收到的所有资源管理器返回的结果信息为可以提交,则事务管理器向所有资源管理器发送提交事务的指令。
2. MySQL XA事务操作
- 开启XA事务,如果使用的是XA START命令而不是XA BEGIN命令,则不支持 JOIN 操作。xid 是一个唯一值,表示事务分支标识符。
XA {START|BEGIN} xid {JOIN}
- 提交一个XA事务,如果使用ONE PHASE命令,表示使用一阶段提交。在两阶段提交协议中,如果只有一个资源管理器参与操作,则可以优化为一阶段提交。
XA COMMIT xid [ONE PHASE]
- 结束一个XA事务
XA PREPARE xid
- 准备提交XA事务
XA PREPARE xid
- 回滚XA事务
XA ROLLBACK xid
- 列出所有处于准备阶段的XA事务
XA RECOVER [CONVERT XID]
MySQL XA 事务使用XID表示分布式事务,xid主要由以下几部分组成
xid: gtrib[, bqual [, formatID]]
- gtrid:必须,为字符串,表示全局事务标识符。
- bqual:可选,为字符串,默认为空串,表示分支限定符。
- formatID:可选,默认值为1,用于标识gtrid和bqual值使用的格式。