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实现分布式事务代码实例

相关推荐
captain3767 小时前
MyBatis(入门5)其他查询操作
java·数据库·spring boot·mybatis
小此方8 小时前
Re:Mysql数据库基础篇(八):详细讲解复合查询、多表查询、自连接、多行、多列子查询与合并查询
数据库·mysql
xszivvvv8 小时前
Mariadb数据库frm文件异常,如何恢复数据
数据库·mariadb
smile_life_8 小时前
MySQL 设置 防止账户被暴力破解
数据库·mysql
ShineWinsu9 小时前
对于Qt:QRadioButton常见属性以及QButtonGroup的解析
数据库·c++·qt·microsoft·gui·qradiobutton·qbuttongroup
测试盐9 小时前
oracle数据库卡顿排查
数据库·oracle
滕州市燕猫虎计算机科技工作室个体工商户9 小时前
MySQL、MVCC、多版本并发控制
数据库·mysql·mvcc·数据库事务
明航咨询-陈老师9 小时前
ITSS运行维护服务能力成熟度认证技术纵深:标准模型、等级路径、2026审核趋势与CS/CMMI对比
服务器·数据库·cmmi
CodeGL10 小时前
开源的分布式任务调度平台:XXL-Job
分布式·开源
缓慢更新10 小时前
AI 辅助生成单测:从接口定义到用例的流水线
java·服务器·前端·网络·数据库·人工智能