当前位置: 首页 > news >正文

SpringCloud跨服务调用失败Seata无法回滚解决办法

遇到的问题

在微服务项目中 有A、B、C三个服务 其中 A调用B服务 ,B调用C, 这些就是跨服务调用了,在A服务中 还调用了一个当前模块执行插入数据的方法(在这里我就叫它为AA 也就是mybatis/spring管理的本地事务)

A服务开启全局事务注解 @GlobalTransactional
B服务注解 @Transactional(propagation = Propagation.REQUIRES_NEW)
C服务注解 @Transactional(propagation = Propagation.REQUIRES_NEW)
AA是所属A模块中的Service的一个方法 也叫本地服务

遇到的问题1) A调用B失败后 A提交了没有回滚

原因 : A调用B失败后 B抛出的异常被 微服务全局捕异常给处理了 并没有抛出异常(再抛还是会被全局捕异常处理的) TM不知道B失败了

这里可以在全局捕异常中将 分布式事务关闭

  /*** 如果开启分布式事务,就设置response.status = 500,seata的tm(事务管理器)* 并主动回滚**/private static void setRespErrStatus(HttpServletResponse response) {//如果开启分布式事务,设置错误状态码,让事务回滚if (StringUtils.isNotBlank(RootContext.getXID())) {log.error("全局捕异常 捕获到Seata " + " 事务id-------------API--------->" + RootContext.getXID());log.error("全局捕异常 捕捉到Seata 事务" + RootContext.getXID() + " 抛出异常 设置response 状态码为 500 ");log.error("全局捕获到 Seata异常 全局回滚");try {response.setStatus(500);GlobalTransactionContext.reload(RootContext.getXID()).rollback();log.error(" 数据提交失败");} catch (TransactionException e) {log.error(" 捕获seata异常·不处理");}} else {response.setStatus(200);}}

遇到的问题2)B调用C失败后 AB都提交了没有回滚

原因 : C服务虽然加了 @Transactional(propagation = Propagation.REQUIRES_NEW) 这个在TM没有注册进来(听说是Seata中的bug 博主没有去复现这个问题 这个需要我们调用 RootContext.bind(xid); 进行绑定 )

在Feign调用前 判断 xid是否为空 如果不为空则将 xid绑定

	String xid =RootContext.getXID() ; //获取 xid RootContext.bind(xid); //绑定 xid

遇到的问题3)A调用AA失败后 ABC都提交了没有回滚

原因 : 这个是因为分布式事务调用是正常的,只是本地事务失败了 所有分布式事务都提交了,本地事务未提交 ()

遇到的问题4)ABC服务都失败了,ABC事务回滚了 AA提交了

原因 这个是因为分布式事务调用失败, AA本地事务没有加入到分布式事务中去导致的

    String xid =RootContext.getXID() ;xxService.insertScoresGoodInfos(sSysProjectMenu.getPath(),xid);@Overridepublic int insertScoresGoodInfos(String sysType  ,String xid) {RootContext.bind(xid); // 将本地事务加到分布式事务组中去return baseMapper.insertScoresGoodInfos(sysType, sysType + UUID.randomUUID().toString());}

maven

版本如下 seata 版本为1.6.1 (SpringCloud Alibaba里面自带的,如果想用更高版本的可以 排查单独引入 不推荐这个比较坑)

<spring-cloud.version>2021.0.8</spring-cloud.version><spring-cloud-alibaba.version>2021.0.5.0</spring-cloud-alibaba.version><spring-boot.version>2.7.13</spring-boot.version><druid.version>1.2.18</druid.version><dynamic-ds.version>3.5.2</dynamic-ds.version><mysql.version>5.1.49</mysql.version><!-- SpringCloud 微服务 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency><!-- SpringCloud Alibaba 微服务 --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>${spring-cloud-alibaba.version}</version><type>pom</type><scope>import</scope></dependency><!-- SpringBoot 依赖配置 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${spring-boot.version}</version><type>pom</type><scope>import</scope></dependency><!-- Druid --><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>${druid.version}</version></dependency><!-- Dynamic DataSource --><dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId><version>${dynamic-ds.version}</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>${mysql.version}</version></dependency><!-- Seata--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-seata</artifactId></dependency>
http://www.lryc.cn/news/267059.html

相关文章:

  • OSG三维渲染引擎编程学习之一百零一:“第十一章:OSG粒子” 之 “11.2 粒子模拟过程”
  • Autosar CAN开发03(从实际应用认识CAN总线的物理层)
  • vue中父子组件传值
  • 【网络编程】基于UDP数据报实现回显服务器/客户端程序
  • sqlilabs第三十二三十三关
  • 第二十一章博客
  • PSoc62™开发板之按键控制LED
  • Vue-Pinina基本教程
  • 大批量数据导出csv,平替导出excel性能优化解决方案封装工具类
  • C++ Qt开发:Charts绘制各类图表详解
  • 【SassVue】仿网易云播放器动画
  • CentOS进入单用户模式
  • 微信小程序~如何设置页面的背景色
  • 图灵日记之java奇妙历险记--输入输出方法数组
  • CSS新手入门笔记整理:CSS3弹性盒模型
  • OCP NVME SSD规范解读-1
  • 大规模和复杂问题挑战——分治思想来应战
  • 六西格玛的科技漩涡——张驰咨询如何促成企业变革
  • 由于被认为是客户端对错误(例如:畸形的请求语法、无效的请求信息帧或者虚拟的请求路由),服务器无法或不会处理当前请求。
  • 【案例】图片预览
  • ubuntu 18/20/22 安装 mysql 数据库
  • 通过U盘:将电脑进行重装电脑
  • C# SqlSugar 数据库 T4模板
  • ARM AArch64的TrustZone架构详解(下)
  • 《Nature》预测 2024 科技大事:GPT-5预计明年发布等
  • 「Verilog学习笔记」并串转换
  • 应急响应常用命令
  • 使用React和ResizeObserver实现自适应ECharts图表
  • 修改第三方npm包
  • Redis性能优化:关键配置和最佳实践