处理 Seata分布式事务中 没有传递XID 导致事务失效的问题
问题与解决思路:当业务方法开启全局异常处理器后,TM注册到TC获取到一个XID,此时在业务中,服务远程访问时,此XID会被下面分支业务方法RM接收到,当各个方法处理完成后RM会向TC直接交互把结果通过XID通知给TC,最后业务方法结束后,TM会通知TC业务已经完成,TC会根据RM通知的结果来通知各个RM提交或者回滚。但是在分布式事务中,入口TM扇出时不会将XID放入请求头中向其他服务传递,这样就导致全局异常捕获失效,因此需要手动将XID设置到请求头中,携带给各分支业务来避免事务失效问题
在服务入口中,添加下面配置来手动设置拦截器,给请求头设置一个唯一XID
<!--Seata依赖-->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-seata</artifactId><version>2.2.6.RELEASE</version><exclusions><exclusion><groupId>io.seata</groupId><artifactId>seata-spring-boot-starter</artifactId></exclusion></exclusions>
</dependency>
<dependency><groupId>io.seata</groupId><artifactId>seata-spring-boot-starter</artifactId><version>1.4.2</version>
</dependency>
import feign.RequestInterceptor;
import feign.RequestTemplate;
import io.seata.core.context.RootContext;
import org.apache.commons.lang.StringUtils;
import org.springframework.context.annotation.Configuration@Configuration
public class FeignConfig implements RequestInterceptor {@Overridepublic void apply(RequestTemplate template) {//新获取一个XIDString xid = RootContext.getXID();//非空验证if(StringUtils.isNotEmpty(xid)){//移除头中原有的KIDtemplate.removeHeader(RootContext.KEY_XID);//装配新的XIDtemplate.header(RootContext.KEY_XID,xid);}}
}
处理 Seata分布式事务中 没有传递XID 导致事务失效的问题相关推荐
- seata 分布式事务没有传递xid导致事务失效解决方案
seata 分布式事务没有传递xid导致事务失效解决方案 当spring cloud 设置全局开启分布式事务,在调用分支事务没有传递xid,原因是feign或者http调用时候 header 没有pu ...
- java事务中使用try catch 导致事务不回滚的问题
@Transactional注解的触发,只回滚RuntimeException和Error异常,默认不回滚非RuntimeException异常 解决方法: 1.方法前添加注解(基础的 @Trans ...
- seata1.5.1 分布式事务没有传递xid,xid为null,事务参与者获取不到xid导致事务失效解决方案
环境版本:seata--- 1.5.1 问题:分布式事务没有传递xid导致事务失效解决方案,事务参与者通过RootContext.getXID()没有获取到xid. 解析seata传递原理: 1.在G ...
- mysql innodb事务中_MySQL InnoDB如何保证事务特性示例详解
前言 如果有人问你"数据库事务有哪些特性"?你可能会很快回答出原子性.一致性.隔离性.持久性即ACID特性.那么你知道InnoDB如何保证这些事务特性的吗?如果知道的话这篇文章就可 ...
- mysql事务中怎么更改空值_MySQL事务
1.事务 1.事务特性--ACID Atomicity(原子性):要么全做,要么不做,不能只做一半(银行转账) Consistency(约束性):事务的前后,约束都能满足 Isolation(依赖性) ...
- REPEATABLE-READ隔离级别 事务中无法读到其它事务提交了的最新数据
前言: 业务要求一个简单的并发控制,使得一条数据只被确认一次,我的方案是 悲观锁,就是在事务中先对数据行加锁(MySQL InnoDB 行锁基于索引),判断是否已经确认过,未确认的情况下确认,已确认则 ...
- 分布式事务中Tcc模式常见问题(幂等、空回滚、空悬挂)解决
TCC的异常场景 在分布式系统中,随时随地都需要面对网络超时,网络重发和服务器宕机等问题.所以分布式事务框架作为搭载在分布式系统之上的一个框架型应用也绕不开这些问题.具体而言,有以下常见问题: 幂等处 ...
- 《深入理解分布式事务》第三章 Spring 事务的实现原理
<深入理解分布式事务>第三章 Spring 事务的实现原理 文章目录 <深入理解分布式事务>第三章 Spring 事务的实现原理 一.Spring 事务原理 1.JDBC 直接 ...
- Spring Boot 中使用 @Transactional 注解配置事务管理
From: https://blog.csdn.net/nextyu/article/details/78669997 事务管理是应用系统开发中必不可少的一部分.Spring 为事务管理提供了丰富的功 ...
最新文章
- Navicat连接数据库成功,新建查询时提示错误“Cannot create file ……”
- 关于全连接层梯度的链式法则
- SqlServer2005复制分类
- 梯度下降法——得到的结果可能是局部最优值,如果凸函数则可保证梯度下降得到的是全局最优值...
- .net 怎么在控制器action中返回一个试图_一个view事件分发,面试官6连问直击灵魂,我被虐的体无完肤...
- winform TreeView树节点上下移动
- 如何快速开发后台管理系统【未完,待补充,欢迎拍砖】
- python基础--面向对象初始
- MATS-2010H硬磁测量装置产品详细介绍
- Oracle 字符串批量替换
- 人工智能--遗传算法求解TSP问题
- Hadoop大数据技术课程总结2021-2022学年第1学期
- 658.一元二次方程公式
- python爬取网页数据步骤_如何轻松爬取网页数据?
- 删除电脑桌面的IE(Internet Explorer)浏览器图标
- node 生成随机头像_给微信设置卡通头像,再不怕撞脸!
- 什么是Autorun病毒?它的运作原理是什么?如何手工清除?
- karabiner json语法
- Python 于 webgame 的应用(上)
- PostgreSQL数据库存储结构