首先看到这个问题,我们可以翻译一下大致意思是,xid所对应的事务已经完成或者说结束了,所以找不到,那么究竟是什么情况会导致这个问题呢?
通过阅读官方文档里面给出了一种情况
1,超时
1)你所写的服务完成时间太长了,全局事务此时已经回滚,然后你在找能找到嘛?
2)FeginClient超时,在springboot的Application配置文件里面,我们常常会配置FeginClient的超时时间,但是服务与服务之间的调用伴随着网络,以及服务自身的增改所带来的时间问题,从而导致FeginClient超时,也会产生这种错误,可以将超时时间适当增长。
2,@GlobalTransationl和@Transationl位置产生问题
@GlobalTransationl得写在外层,不能出现在@Transationl的内层,这样也会产生此错误
3,强行获取绑定
在我遇到的一种情况中,我们的业务都没有使用@GlobalTransationl这个注解,但是却产生了xid和这个错误,看了注解,和配置发现都没啥问题,也不是单体和集群的问题,那么究竟是什么问题,不由得让我们想到,这个xid是怎么产生的,然后通过日志查看,在看了控制层,发现开发人员,写了一个方法,RootContext.getXid,且调用了bind方法,将xid与服务做了绑定。
4,服务器时间不一致
我们将做成集群之后,各个服务之间的时间可能不一致,写一个同步时间脚本就ok了。