Seata中AT模式下是需要本地事务提交才会像TC注册分支事务吗?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
在Seata的AT模式下,事务流程遵循以下步骤:
全局事务开始:应用通过Transaction Manager(TM)向Transaction Coordinator(TC)请求开启一个全局事务,TC生成一个全局唯一的XID。
XID传播:该XID会在微服务间的调用链路中传播。
本地事务执行与分支注册:当业务方法执行到数据访问层时,Resource Manager(RM)会拦截SQL操作,并在本地事务开始之前先向TC注册分支事务,此时会携带XID。这意味着在本地事务实际执行之前,分支事务信息就已经在TC中记录了。
本地事务提交尝试:RM在执行SQL操作后,如果本地事务提交成功,它会向TC报告分支事务的准备状态(Prepared),表示该分支已准备好提交。
全局提交或回滚决策:TM根据业务逻辑决定是否提交全局事务,并向TC发送相应的指令(Commit或Rollback)。
事务完成:TC根据TM的决策,调度所有分支事务进行最终的提交或回滚操作。
综上所述,在AT模式下,本地事务并非必须提交后才向TC注册分支事务。实际上,是在本地事务执行前,通过RM向TC注册分支事务。这样设计是为了确保即使本地事务因故未提交或回滚,TC也能够拥有足够的信息来管理全局事务的生命周期,保证数据一致性。