https://segmentfault.com/a/1190000020125846
最开始只看到Could not retrieve transation read-only status server
没看到下面的Communications link failure
,以为是在代码中手动设置事务状态为只读或者事务回滚,后来查代码也没发现。
当看到Communications link failure
意识到连接异常,但与当前方法连接同一个库的其他方法可以执行成功,所以数据库服务也是正常的。
最终发现原因:排查的方法中有其他操作发送http请求,稍微有点耗时,但整个方法一分钟之类肯定能处理完。
分析:
wait_timeout 设置过小,mysql自动丢弃连接,但是程序端没有超时,造成依然在这个被丢弃的连接上执行语句
最终解决办法:
设置mysql wait_timeout 参数
show global variables like '%timeout%';
SET GLOBAL wait_timeout=86400;
此处的单位应该是秒。
当前处理的默认值是5
设置86400可能有点极端
其他客户都设置了,就这个可能测试环境,配置的时候忘记改参数了。
https://blog.csdn.net/Hello_World_QWP/article/details/80654536
问题分析:
导致这个异常的情况有两种:
一种情况为:使用MySql数据库服务为最新版本8.0.11,而在项目开发的过程中使用了低版本的MySql驱动包。
二种情况为: 当MySQL的数据库隔离级别为REPEATABLE-READ时,查询一个select语句也算是事物的开始,而且在hibernate里会把以select语句开头的事务标记为只读事务,此时在这个事务里再执行insert、update、delete等DML语句就会出现如上的异常信息。
解决方案:
解决方案一:
修改项目中MySQL数据库驱动包,将版本选择为与当前数据库服务器版本相同的版本,如果是Maven项目,则在pom.xml的配置文件中,键入如下内容:
-
<dependency>
-
<groupId>mysql</groupId>
-
<artifactId>mysql-connector-java</artifactId>
-
<version>${mysql-connector-java.version}</version>
-
</dependency>
注意:${mysql-connector-java.version} 为自己匹配的版本号!!!
如果为普通Web项目,我这儿提供了几个常用版本的MySQL驱动下载,点击下面连接进行下载:
https://download.csdn.net/download/hello_world_qwp/10473266
解决方案二:
通过修改MySQL的事务隔离级别实现,查看当前MySQL数据库的事务隔离级别,输入命令 “ show variables like 'transaction_%'; ” ,如下图:
将隔离级别修改为 -> READ-COMMITTED 即可,输入命令 “ SET GLOBAL transaction_isolation='READ-COMMITTED'; ” 即可解决该问题了。