seata @GlobalTransactional 不生效的问题解决方案

  1. 前提条件我们已经搭建了 springcloud alibaba的 其他框架nacos,sentinel,seata server

  2. 问题1 服务部可用问题

    • 检查seata-server 和 group 和 在 nacos 里面注册额一致

    • 如果还不行可能是版本冲突导致的

  3. @GlobalTransactional 部生效问题

    • 首先我们检查 是否有全局事务ID,xid 是关键如果,请求的时候会通过请求传递到下游服务,没有这个一切白搭
      String xid = RootContext.getXID();
      System.out.println("xid_order:" +xid );

    • 如果有xid还不生效,那就是数据源的问题

      在请求接口中打印数据源类型,我们发现是,HikariDataSource

    • 查询一个这个东西哪里来的,原来是生日那个 boot 自带的数据源

    • seata 使用的默认使用的数据源是,druid,下图可以看到seata-all使用了druid

    • 问题很明显了我们只要,把HikariDataSource换成druid的数据源就可以了HikariDataSource是默认的,如果我们自己初始化了别的数据源HikariDataSource就不会初始化,所以我们直接任意初始化 druid 的数据源

      然后再任意地方确认你的druidDatasource 生效了

    • 设时候请求数据,并且抛出异常,服务就跨服务可以级联回滚了

      请求过程服务A的的addUser方法调用服务B的add方法,先写入服务B的数据,然后写入A的本地1,然后抛出异常,只有 服务A 和 服务B都回滚了 才算分布式事务生效。

      服务A如下图

      服务B如下图

有些说法用 Seata的 DataSourceProxy 代替数据源,实测不需要,start 应该做了这件事情了

posted on 2022-12-13 21:25  zhangyukun  阅读(4149)  评论(0编辑  收藏  举报

导航