MySQL分布式事物(XA事物)的使用
XA
XA是一个编程规范,使用资源管理器针对多个数据的资源进行事物的管理(通过两阶段提交实现事物性)
有时一个系统的数据 放在不同的库之中。如果用普通的事物 一个分支库提交成功了,另外一个分支库提交失败了,
这候 两个库没有同步的成功或者失败。会导致系统数据的不完整。
对于处理这种情况 MySQL有了处理分布式(XA)事物的语法
XA START xid 用于启动一个带给定xid的XA事物。
xid包含3个部分 gtrid,bqual,formatID
- gtrid 是一个分布式事物的标识符,一个分布式事物的每个XA事物的gtrid必须相同,这样可以明确知道每个XA事物属于哪个分布式事物。
- bqual 是一个分支限定符,一个分布式事物的所每个XA事物的bqual值必须不同。
- formatID 是一个数字,用于标识由gtrid和bqual值使用的格式,可以不写 默认是1 。
分布式的关键在于如何确保分布式事物的完整性,以及在某个分支出现问题时的故障解决。
XA事物的相关命令就是提供给应用如何在多个独立的数据库之间进行分布式事物的管理,包括启动一个分支事物,使事物进入准备阶段以及事物的实际提交回滚操作等。
session1 in db1 | session2 in db2 |
xa start 'gtridtest','bqualdb1' 数据库db1中启动一个分布式事物的一个分支 | xa start 'gtridtest','bqualdb2'数据库db2中启动一个分布式事物的一个分支 |
update db1_table1 set content = '测试' where id =1; | update db2_table1 set content = '实验' where id =1; |
xa end 'gtrid _test','bqual_db1' 第一阶段提交 | xa end 'gtrid _test','bqual_db2' 第一阶段提交 |
xa prepare 'gtrid _test','bqual_db1' 进入prepare状态 | xa prepare 'gtrid _test','bqual_db2'进入prepare状态 |
两个事物都进入准备提交阶段,如果之前遇到任何错误 会回滚所有分支 xa recover 命令可以查看PREPARE状态下的事物(建议大家去亲自测试) | |
xa commit 'gtrid _test','bqual_db1' | xa commit 'gtrid _test','bqual_db2' |
一旦开始提交操作 则需要保证全部的分支都要提交成功 如果失败 请看文章结尾 |
如果分支事物达到prepare状态的时,遇到断电等异常。服务器重新启动之后(xa recover可以查到未完成的prepare状态下的XA事物),可以继续对分支 进行回滚或者提交操作 ;
这么看 其实分布式事物也不是完美的 xa事物prepare之后遇到异常不会自动回滚,需要手动进行回滚或者提交。
javax.transaction.xa包 是jdbc控制MySQL XA事物的API
JTA
JTA是XA的规范在Java中的实现