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

相关推荐
进击的雷神1 小时前
数据库知识全面考查:从基础概念到实战应用
jvm·数据库·oracle
@小了白了兔1 小时前
RabbitMQ工作流程及使用方法
分布式·rabbitmq
Le_ee2 小时前
sqli-labs靶场第七关——文件导出注入
数据库·sql·网络安全·php·sql注入·sqli—labs
dddaidai1232 小时前
分布式ID和分布式锁
redis·分布式·mysql·zookeeper·etcd
不知几秋2 小时前
Maven
java·数据库·maven
政沅同学2 小时前
数据库实验报告 SQL SERVER 2008的基本操作 1
数据库
lyw2056192 小时前
MySQL八股(自用)
数据库·mysql
weixin_408266342 小时前
深度学习-分布式训练机制
人工智能·分布式·深度学习
MMMMMMMMMMemory3 小时前
pgsql14自动创建表分区
数据库·pgsql
文牧之3 小时前
PostgreSQL 配置设置函数
运维·数据库·postgresql