Seata 多路服务调用时事务不回滚解决办法
Posted TuskueNeko
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Seata 多路服务调用时事务不回滚解决办法相关的知识,希望对你有一定的参考价值。
最近使用了Seata作为分布式事务管理工具,在一般情况如: A服务调用B服务且A服务调用C服务,即A-B & A-C这种服务调用链路,当其中任意一个服务报错,事务是可以回滚的。
然而,稍微复杂一点的情况我发现seata事务居然不会回滚了!即A-B & B-C & B-D,这种调用链路,seata就不会回滚了,我想说框架都快1.0版本了居然连这种情况都不支持吗?于是我查了查官方文档,嗯,除了一些基本的介绍几乎等于什么都没写,最后我找到了关于微服务的文档说明,原来是通过绑定一个ID来绑定各个服务的事务,因此解决方法如下:
RootContext.bind(entity.getXid());
在服务链路的每个服务接口中都加上绑定XID的代码,必须保证这些服务绑定的都是同一个XID,XID在开启全局事务时会自动生成,因此在A服务这样获取:
xid = GlobalTransactionContext.getCurrentOrCreate().getXid();
然后在后面的B、C、D服务都绑上这个XID就可以正常回滚事务了,希望后续更新会修复这个问题,如有不正确之处还请指正。
以上是关于Seata 多路服务调用时事务不回滚解决办法的主要内容,如果未能解决你的问题,请参考以下文章
Spring Boot @Transactional 不回滚的解决办法
Fescar(Seata)-Springcloud流程分析-2阶段
spring事务传播行为之使用REQUIRES_NEW不回滚
SpringBoot设置 @Transactional ,并在异常处理中调用setRollbackOnly()事务不回滚