mysql Could not retrieve transation read-only status server 的解决办法

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的配置文件中,键入如下内容:

 
  1. <dependency>

  2. <groupId>mysql</groupId>

  3. <artifactId>mysql-connector-java</artifactId>

  4. <version>${mysql-connector-java.version}</version>

  5. </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'; ” 即可解决该问题了。

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值