AP: application 应用程序
RM:resouceManager 资源管理器,tm管理的各个事务,比如各个mysq server
TM:transaction manager 全局事务管理器,比如,写的应用程序,开启XA事务,分配唯一标识符,prepare,commit,rollback等全局控制。
mysql的XA语法有几步:
第一阶段,开启事务,准备提交
XA START 'helloworld1':开启一个XA事务,分配xid
处理业务逻辑
XA END 'helloworld1':标记业务逻辑处理结束
XA PREPARE 'helloworld1':询问rm是否准备好了提交事务,如果事务提交不了,则报错
// 第二阶段,提交事务
XA COMMIT 'helloworld1':如果所有的rm都准备号了提交事务,则这里进行提交
XA ROLLBACK 'helloworld':如果有rm出错了,或者,PREPARE阶段报错了,则进行回滚。
这里有几个疑问:
1.如果用普通的start transaction,commit做上面的事情,会发生什么?
commit阶段可能会出错,导致前几个事务commit成功,最后一个commit失败,导致数据不一致。
而xa事务,如果commit出错,prepare阶段就会出错,就可以回滚了。
2.为什么会存在end和prepare,假设只有一个prepare好像也没有问题。
XA分布式事务的落地实现,比如JTA,但是,XA只能是一个应用操作多个数据库,在微服务环境的多个应用情况下,恐怕就不好做了,需要把TM抽离出中间层。
个人觉得:这些理解就好,无需深究,光mysql的Xa需要serializable环境,包装部脏读就很难办了。
真正落地使用,可以参考,spring cloud Alibaba的seate。
网友评论