seata1.5.1 分布式事务没有传递xid,xid为null,事务参与者获取不到xid导致事务失效解决方案

环境版本: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到你的拦截器里

看到也是缘分,希望您一切顺利,踩了一堆坑做出来的总结,愿君少走弯路。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
Seata是一个开源的分布式事务解决方案,它提供了一套简单易用的API,可以帮助解决分布式事务的问题。Seata使用了两阶段提交协议(Two-Phase Commit,简称2PC)来确保分布式事务的一致性。它由三个核心组件组成:事务协调器(Transaction Coordinator)、资源管理器(Resource Manager)和事务参与者(Transaction Participant)。 事务协调器负责协调和管理全局事务,它负责事务的发起、提交和回滚操作。资源管理器负责管理分支事务的提交和回滚,它与具体的数据源进行交互。事务参与者是分支事务参与者,它负责执行具体的业务逻辑操作。 当一个分布式事务开始时,事务协调器会生成一个全局事务ID,并将这个ID传递给各个事务参与者。每个事务参与者都会将这个ID关联到自己的本地事务中。在事务执行过程中,各个事务参与者会将本地事务的操作记录到日志中。当所有的事务参与者都执行完毕后,事务协调器会向各个参与者发送提交或回滚的指令,并根据各个参与者的反馈结果来决定最终的事务提交或回滚。 Seata支持多种应用场景,包括数据库事务、消息事务以及跨多个微服务的分布式事务。它提供了与各种常见的中间件和框架的集成,如MySQL、Oracle、Dubbo、Spring Cloud等,使得在这些环境下使用Seata非常方便。 总而言之,Seata是一个强大的分布式事务解决方案,可以帮助开发人员简化分布式事务的管理和处理,并保证数据的一致性。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值