MySQL-数据库分布式XA事务

准备

innodb存储引擎开启支持分布式事务

groovy 复制代码
set global innodb_support_ax=on

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

groovy 复制代码
完整

```groovy
xa start gtrid, bqual, formatId; 
xa end gtrid, bqual, formatId;
xa prepare gtrid, bqual, formatId;
xa commit gtrid, bqual, formatId;

bqual: 默认为空

formatId:默认为1

groovy 复制代码
xa start 'a';
insert into z(`a`,`b`,`c`) select 100,2,100
xa end 'a';
xa prepare 'a';
xa recover;
xa commit 'a';

1. XA START 'a';

  • 作用 :开始一个新的XA事务,并分配一个唯一的事务ID 'a'。
  • 说明 :在这个命令之后,所有后续的SQL操作都会被包含在这个XA事务中,直到遇到XA END命令。

2. insert into z(a,b,c) select 100,2,100;

  • 作用 :执行一条插入语句,将值(100, 2, 100)插入到表z中。
  • 说明:这条语句是在XA事务上下文中执行的,这意味着如果最终XA事务没有成功提交,这个插入操作也不会对数据库产生实际影响。

3. XA END 'a';

  • 作用 :标记XA事务'a'的操作结束。
  • 说明 :这并不意味着事务已经完成或提交,它只是表明当前事务不再接受新的操作。在XA END之后,不能再对该事务进行任何修改操作。

4. XA PREPARE 'a';

  • 作用 :准备XA事务'a',使其进入预备状态。
  • 说明:这是两阶段提交(2PC, Two-Phase Commit)的第一阶段。在这个阶段,所有参与的资源管理器会投票决定是否可以安全地提交该事务。如果所有参与者都准备好提交,则可以进入下一阶段;如果有任何一个参与者不能准备好,则整个事务会被回滚。

5. XA RECOVER;

  • 作用:列出所有处于预备状态但尚未完成提交或回滚的XA事务。
  • 说明:这个命令对于恢复未完成的XA事务非常有用,特别是在系统崩溃后需要手动干预来解决悬挂事务时。

6. XA COMMIT 'a';

  • 作用 :提交XA事务'a'。
  • 说明 :这是两阶段提交的第二阶段。只有当所有参与的资源管理器都已准备好(通过XA PREPARE),并且没有任何错误发生时,才会执行此命令。提交后,所有更改将永久保存到数据库中。

当如下代码:

groovy 复制代码
xa start 'a';

insert into z(`a`,`b`,`c`) select 100,2,100
xa end 'a';
xa prepare 'a';
//不进行提交xa commit 'a';

可看悬挂的分布式事物列表:

groovy 复制代码
xa recover;
  • gtrid_length: gtrid字符的长度,按字节计算。
  • bqual_length: bqual字符的长度,按字节计算。

提交或者回滚的方式:

groovy 复制代码
xa commit 'a'

xa rollback 'a'

改变gtrid长度

groovy 复制代码
xa start 'aaa';
insert into z(`a`,`b`,`c`) select 100,2,100
xa end 'aaa';
xa prepare 'aaa';

提交或者回滚的方式:

groovy 复制代码
xa commit 'aaa'
xa rollback'aaa'

改变gtrid长度和bqual长度

groovy 复制代码
xa start 'aaa','bbb';
insert into z(`a`,`b`,`c`) select 100,2,100
xa end 'aaa','bbb';
xa prepare 'aaa','bbb';

提交或者回滚的方式:

groovy 复制代码
xa commit 'aaa','bbbb'

xa rollback'aaa','bbbb'

改变gtrid长度、bqual长度、formatId值

groovy 复制代码
xa start 'aaa','bbb', 100;
insert into z(`a`,`b`,`c`) select 100,2,100
xa end 'aaa','bbb', 100;
xa prepare 'aaa','bbb', 100

提交的方式:

提交或者回滚的方式:

groovy 复制代码
xa commit 'aaa','bbbb',100

xa rollback'aaa','bbbb',100

总结

这段脚本演示了一个完整的XA事务流程:

  1. 开始一个新的XA事务。
  2. 执行一些数据库操作(在这里是一个插入操作)。
  3. 结束XA事务的操作部分。
  4. 准备XA事务以供提交。
  5. 检查是否有任何未完成的XA事务(虽然在这个例子中看起来不太必要,但在实际应用中可用于故障恢复)。
  6. 最终提交XA事务,使所有更改生效。

这种机制特别适用于需要跨多个数据库或其他资源管理器保持一致性的场景,例如银行转账、电子商务订单处理等。然而,XA事务也有其局限性,比如性能开销较大,因为它涉及到更多的协调步骤,并且可能会导致阻塞问题。因此,在设计系统时需要权衡使用XA事务的成本与收益。

java实现分布式事务代码实例

相关推荐
小白男神5 天前
MySQL进阶学习四(存储过程、游标、触发器)
mysql
这个DBA有点耶5 天前
MVCC深入:Read View、版本链与快照读——InnoDB并发控制的内核
数据库·mysql·架构
DBA_G5 天前
从地面到云霄:GBase数据库在民航三大场景的落地实践
数据库
自由能燃气设备5 天前
商用全预混低氮冷凝锅炉免费方案vs付费方案对比+选型避坑指南
大数据·数据库·人工智能
科创致远5 天前
科创致远 ESOP 系统核心效能与实战价值展示
大数据·数据库·人工智能·精益工程
kybs19915 天前
全球灾害数据分析可视化 毕业设计-附源码66794
vue.js·spring boot·mysql·安全·django·c#·asp.net
2601_962218615 天前
万象生鲜系统称重自动多退少补算法解决生鲜非标品痛点
大数据·数据库·人工智能·python·算法
程序猿_极客5 天前
【免费】分享一套优质的基于SSM的校园失物招领系统的设计与实现,源码+文档+视频详解(讲解)
java·mysql·ssm·课程设计·失物招领系统
张洛闻Eren5 天前
k8s云原生【第十课】:水平 Pod 自动扩缩容
运维·数据库·云原生·kubernetes·github
于平安5 天前
MySQL-触发器
数据库·mysql