前言:
一般这个报错大多是网络原因导致的,确保你不是网络问题再往下看
问题
在一个方法上(该方法非常复杂执行时间长)加了 @Transactional(rollbackFor = Exception.class)后出现了如下图所示的错误
解决:
经过排查并非网络问题。复现时,在数据库执行show processlist;发现出现了很多存在时间非常长的锁(非死锁),那么大概率是因为数据库连接池的连接数不够导致的数据库连接失败中断。在长事务中每次进行数据库操作都要占用连接数,并且因为事务没有提交的原因,一直没有释放连接。细化事务的范围即可(不保证整个过程一致)
比如你的主方法在A类,调用了B类的方法,就别在A类方法上加事务注解,而是在B类被调用的上方法加。如果A类调用B类方法是多次调用的话(比如循环),那么他会在B类开启你循环次数个事务,每个事务独立。例如你调用了100次,前99次全成功,最后一次失败,他是不会回滚前99次的操作的,而是会回滚你第100次的操作。
扩展解释:
@Override
public void B() {
// 操作数据库的方法
}
@Transactional(rollbackFor = Exception.class)
public void A(List<String> strs)