环境版本:seata--- 1.5.1
问题:分布式事务没有传递xid导致事务失效解决方案,事务参与者通过RootContext.getXID()没有获取到xid。
解析seata传递原理:
1.在GlobalTransactional方法内发起feign调用,seata会在请求前进行拦截,实现方法在源码
com.alibaba.cloud.seata.feign.SeataFeignClient.getModifyRequest()
,然后再将xid放到请求头里进行传递。
2.feign调用事务参与者,然后到参与者这边它会对请求进行拦截然后绑定xid,实现HandlerInterceptorAdapter,源码如下
3.经过Debug发现,请求头有正常传递xid,但是没有绑定xid,所以断定TransactionPropagationInterceptor没有生效,xid没有传递所以事务没有回滚。
4.为什么没有生效呢?
这个没有去重点关注了,盲猜跟我实现swagger2继承了WebMvcConfigurationSupport有关。
5.解决
再现有的拦截器里加入TransactionPropagationInterceptor的代码,对seata xid进行绑定
io.seata.integration.http.TransactionPropagationInterceptor.preHandle()方法内代码copy到你的拦截器里
看到也是缘分,希望您一切顺利,踩了一堆坑做出来的总结,愿君少走弯路。