准备
innodb存储引擎开启支持分布式事务
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
xa start gtrid, bqual, formatId;
xa end gtrid, bqual, formatId;
xa prepare gtrid, bqual, formatId;
xa commit gtrid, bqual, formatId;
bqual: 默认为空
formatId:默认为1
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
),并且没有任何错误发生时,才会执行此命令。提交后,所有更改将永久保存到数据库中。
当如下代码:
xa start 'a';insert into z(`a`,`b`,`c`) select 100,2,100
xa end 'a';
xa prepare 'a';
//不进行提交xa commit 'a';
可看悬挂的分布式事物列表:
xa recover;
- gtrid_length: gtrid字符的长度,按字节计算。
- bqual_length: bqual字符的长度,按字节计算。
提交或者回滚的方式:
xa commit 'a'xa rollback 'a'
改变gtrid长度
xa start 'aaa';
insert into z(`a`,`b`,`c`) select 100,2,100
xa end 'aaa';
xa prepare 'aaa';
提交或者回滚的方式:
xa commit 'aaa'
xa rollback'aaa'
改变gtrid长度和bqual长度
xa start 'aaa','bbb';
insert into z(`a`,`b`,`c`) select 100,2,100
xa end 'aaa','bbb';
xa prepare 'aaa','bbb';
提交或者回滚的方式:
xa commit 'aaa','bbbb'xa rollback'aaa','bbbb'
改变gtrid长度、bqual长度、formatId值
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
提交的方式:
提交或者回滚的方式:
xa commit 'aaa','bbbb',100xa rollback'aaa','bbbb',100
总结
这段脚本演示了一个完整的XA事务流程:
- 开始一个新的XA事务。
- 执行一些数据库操作(在这里是一个插入操作)。
- 结束XA事务的操作部分。
- 准备XA事务以供提交。
- 检查是否有任何未完成的XA事务(虽然在这个例子中看起来不太必要,但在实际应用中可用于故障恢复)。
- 最终提交XA事务,使所有更改生效。
这种机制特别适用于需要跨多个数据库或其他资源管理器保持一致性的场景,例如银行转账、电子商务订单处理等。然而,XA事务也有其局限性,比如性能开销较大,因为它涉及到更多的协调步骤,并且可能会导致阻塞问题。因此,在设计系统时需要权衡使用XA事务的成本与收益。
java实现分布式事务代码实例