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

相关推荐
lixora1 分钟前
备份指定oracle block 防止误操作
数据库
凯子坚持 c8 分钟前
Redis 数据库的服务器部署与 MCP 智能化交互深度实践指南
服务器·数据库·redis
DBA小马哥13 分钟前
Oracle迁移金仓全攻略:工业IOT场景下的易用性与安全保障
数据库·物联网·安全·oracle
‘胶己人’15 分钟前
redis分布式锁
数据库·redis·分布式
山沐与山16 分钟前
【MQ】Kafka与RocketMQ深度对比
分布式·kafka·rocketmq
初恋叫萱萱25 分钟前
基于CodeRider-Kilo和MySQL开发一款书店管理系统
数据库·mysql·产品运营
图乐aj28 分钟前
MySQL 运维之日常运维篇 二
运维·mysql
Elastic 中国社区官方博客30 分钟前
通过 Elasticsearch 中的 function score query 按利润和受欢迎程度提升电商搜索效果
大数据·数据库·elasticsearch·搜索引擎·全文检索
武子康30 分钟前
Java-203 RabbitMQ 生产者/消费者工作流程拆解:Connection/Channel、默认交换器、ACK
java·分布式·消息队列·rabbitmq·erlang·ruby·java-rabbitmq
qq_3663363733 分钟前
mysql-5.7.38-winx64.zip 启动教程(免安装版)
数据库·mysql·adb