走在勇往直前的路上 2023-06-28 21:52 采纳率: 0%
浏览 8

seata搭建遇到的坑

#A服务调用B服务,seata事务失效
#背景: springboot两个微服务,seata,nacos
#问题:
1.是否必须使用rpc框架?(目前是手写http)
2.是否必须使用注册中心?
3.A服务绑定了xid,B服务也能拿到,为啥模拟异常后事务不生效

A服务: 
@GlobalTransactional
@RequestMapping("test")
public R test() {
    jdbcTemplate.update("INSERT INTO sys_user ( username) VALUES ( 'admin服务');");
    HttpRequest.post("http://127.0.0.1:8081/sy-api/api/test").header(RootContext.KEY_XID, RootContext.getXID()).execute();
    int i = 1 / 0;//模拟异常
    return R.ok();
}

B服务:
@RequestMapping("test")
public R test() {
    jdbcTemplate.update("INSERT INTO sys_user ( username) VALUES ( 'api服务');");
    //int i = 1 / 0;
    return R.ok();
}
  • 写回答

1条回答 默认 最新

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

      问题1:是否必须使用rpc框架?目前我是手写http通信的方式,是否有更好的替代方案?

      在seata中,使用rpc框架进行通信是必须的,因为seata依赖于分布式事务,而分布式事务需要统一的协调和管理。常用的rpc框架包括Dubbo、gRPC、Spring Cloud等,你可以选择一个适合你项目的框架来集成seata。

      如果你目前使用的是手写的http通信方式,可以考虑将其改造成支持rpc通信的方式,具体步骤如下:

      1. 选择一个合适的rpc框架,比如Dubbo或Spring Cloud。
      2. 集成rpc框架到你的项目中,具体步骤可以参考对应框架的官方文档。
      3. 根据seata提供的rpc通信协议,修改你的代码,使用rpc框架来进行通信。
      4. 测试和验证修改后的代码是否能正常与seata进行通信。

      问题2:是否必须使用注册中心来管理服务?我对注册中心的作用还不是很清楚,是否可以绕过它直接使用seata?

      在seata中,注册中心的作用是用来管理和注册被seata管控的服务实例。通过注册中心,seata可以动态地获取、管理和调用各个服务的实例。因此,使用注册中心是必须的,不能绕过。

      常用的注册中心包括ZooKeeper和Nacos,你可以根据你的项目需求选择一个适合的注册中心,并集成到你的项目中。具体步骤如下:

      1. 选择一个合适的注册中心,比如ZooKeeper或Nacos。
      2. 集成注册中心到你的项目中,具体步骤可以参考对应注册中心的官方文档。
      3. 对你的服务进行注册,使seata能够感知到你的服务实例。
      4. 配置seata的注册中心信息,使seata能够连接到注册中心,并获取服务实例的信息。

      问题3:我的服务A绑定了xid,但是当我模拟异常后,事务似乎没有生效。我想知道为什么会这样,可能是出了什么问题?

      事务不生效的问题可能存在多种原因,下面是一些常见的可能原因和对应的解决方案:

      1. 检查seata server的配置文件,确认配置文件中的事务日志存储模式是否正确。seata支持多种存储模式,包括file、db和redis等,默认是file模式。如果你使用的是db模式,确认数据库配置是否正确。
      2. 检查你的服务A是否正确地绑定了xid。确保在服务A中正确地绑定xid,在整个事务中使用相同的xid。
      3. 检查你的服务A是否正确地使用了seata提供的事务注解。在需要参与分布式事务的方法上添加相应的注解,如@GlobalTransactional。
      4. 检查你的服务A是否正确地与seata进行通信。确认你的服务A的rpc配置是否正确,并能够正常与seata server建立连接。
      5. 检查你的服务A是否正确地提交或回滚事务。在事务操作完成后,使用seata提供的API来提交或回滚事务,确保事务的状态被正确地结束。

      如果经过以上步骤的检查和排查,问题仍然存在,请提供更多的详细信息和日志,以便进一步分析和解决。

      以上是对问题的解答,如果有任何其他疑问,请随时提出。


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 创建了问题 6月28日

悬赏问题

  • ¥15 matlab无法读取mat文件,如何解决?
  • ¥15 51单片机读写24C02
  • ¥50 grlb复位怎么能够不回调?也不卡在home状态?
  • ¥15 win系统下做一个开机自动最大化运行某应用程序的执行文件
  • ¥15 grlb复位,设置设置返回行程为0,卡在home状态,怎么解决?
  • ¥100 CubeIDE更换芯片以及调整代码
  • ¥50 有没有可以远程指导问题
  • ¥15 origin柱状图,分组如何分
  • ¥15 两个不同IP互通的配置命令
  • ¥15 office弹窗激活问题