seata @GlobalTransactional 不生效的问题解决方案
-
前提条件我们已经搭建了 springcloud alibaba的 其他框架nacos,sentinel,seata server
-
问题1 服务部可用问题
-
检查seata-server 和 group 和 在 nacos 里面注册额一致
-
如果还不行可能是版本冲突导致的
-
-
@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) 编辑 收藏 举报