iyuks 2023-04-22 20:36 采纳率: 85.4%
浏览 24
已结题

seata失效,内层事务不回滚

img

cloudServiceApi.saveSsmbd(t)是通过openfeign调用的,里边的service方法加了@Transactional注解。外层事务回滚了,内层事务没有回滚,这是什么原因?

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-04-23 14:50
    关注
    不知道你这个问题是否已经解决, 如果还没有解决的话:
    • 以下回答来自chatgpt:

      首先,需要了解Seata的分布式事务是如何实现的。Seata基于两阶段提交协议来实现分布式事务,即XA协议。在分布式事务中,存在多个参与者(即各个服务),其中有一个协调者(即Seata Server)来控制整个事务流程,具有事务开启、提交、回滚等功能。 针对这个问题,可能是由于被调用的服务没有正确地加入Seata的事务管理中,导致内部事务未能受到外部事务的影响。解决该问题需要进行如下操作: 1. 确保所调用的服务已经引入了Seata相关的依赖和配置文件,并且已经正确地进行了服务注册和配置。 2. 在@FeignClient注解中添加configuration属性,指定Feign配置类,例如:

      @FeignClient(value = "cloud-service", configuration = CloudServiceFeignConfiguration.class)
      
      1. 创建Feign配置类,并在其中配置请求拦截器,用于向调用的服务中添加Seata的XID信息。其中,XID即为全局事务ID,用于标识整个分布式事务。
      @Configuration
      public class CloudServiceFeignConfiguration {
          @Bean
          public RequestInterceptor addXIDInterceptor() {
              return new RequestInterceptor() {
                  @Override
                  public void apply(RequestTemplate requestTemplate) {
                      String xid = RootContext.getXID();
                      if (StringUtils.isNotEmpty(xid)) {
                          requestTemplate.header(RootContext.KEY_XID, xid);
                      }
                  }
              };
          }
      }
      
      1. 在调用的服务中,使用@GlobalTransactional注解来添加Seata的全局事务支持,并在需要进行事务控制的方法上添加@Transactional注解。例如:
      @Service
      public class CloudServiceImpl implements CloudService {
          @Override
          @GlobalTransactional(timeoutMills = 300000, name = "cloud-service-tx")
          public void saveSsmbd(Ssmbd t) {
              ssmbdDao.insert(t);
          }
      }
      
      1. 在被调用的服务中,需要进行相关的异常处理,以保证事务能够正确地回滚。例如,在saveSsmbd方法中,如果发生异常,需要手动抛出异常以回滚事务。例如:
      @Service
      public class CloudServiceImpl implements CloudService {
          @Override
          @GlobalTransactional(timeoutMills = 300000, name = "cloud-service-tx")
          public void saveSsmbd(Ssmbd t) {
              try {
                  ssmbdDao.insert(t);
              } catch (Exception e) {
                  throw new RuntimeException(e);
              }
          }
      }
      

      通过以上操作,应该能够解决分布式事务未回滚的问题。如果仍然存在问题,可以尝试查看Seata Server的日志,检查是否有异常或者错误信息。


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 5月2日
  • 已采纳回答 4月24日
  • 创建了问题 4月22日

悬赏问题

  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
  • ¥50 如何openEuler 22.03上安装配置drbd
  • ¥20 ING91680C BLE5.3 芯片怎么实现串口收发数据
  • ¥15 无线连接树莓派,无法执行update,如何解决?(相关搜索:软件下载)
  • ¥15 Windows11, backspace, enter, space键失灵