java修改操作出错:could not retrieve transation read-only status server

一、问题描述

我们一般在写新增、修改、删除操作业务代码时通常都比较简单,一般不会出现运行错误,但这次操作的是三张表(一张主表,二张关联表)出现了:could not retrieve transation read-only status server错误,具体修改操作业务逻辑是:
1、先修改主表,若修改成功即行数大于0则修改下面的关联表;
2、先找出第一张关联表要逻辑删除的数据及新增的数据,再逻辑删除、新增这些数据(一次操作数据较多,最大约1000条左右);
3、先找出第二张关联表要更新的、逻辑删除的以及新增的数据,再逻辑删除、新增这些数据;
4、以上操作加上事务
修改保存以上操作后台出现错误是:

[2019-12-20 14:43:46.323] [http-apr-9029-exec-6] [ERROR] [cn.uce.nos.rms.biz.impl.RmsRouteLineBiz:285] -- 更新线路异常:
org.springframework.dao.TransientDataAccessResourceException: 
### Error updating database.  Cause: java.sql.SQLException: Could not retrieve transation read-only status server
### The error may involve cn.uce.rms.comm.dao.IRmsRouteLineShiftsDao.addConfigLoad-Inline
### The error occurred while setting parameters
### SQL: insert into t_nos_rms_route_line_code (line_id,base_org_code,org_name,create_time,create_emp) values (?,?,?,?,?)
### Cause: java.sql.SQLException: Could not retrieve transation read-only status server
; SQL []; Could not retrieve transation read-only status server; nested exception is java.sql.SQLException: Could not retrieve transation read-only status server
	at org.springframework.jdbc.support.SQLStateSQLExceptionTranslator.doTranslate(SQLStateSQLExceptionTranslator.java:108)
	at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:73)
	........................

二、问题分析

通过关键字:could not retrieve transation read-only status server 百度搜索得出大概有如下几种可能出错原因及解决方案:
1、使用MySql数据库服务为较新版本,而在项目开发的过程中使用了低版本的MySql驱动包。
解决方案为:更换高版本MySql驱动包
2、当MySQL的数据库隔离级别为REPEATABLE-READ时,查询一个select语句也算是事物的开始,而且在程序里会把以select语句开头的事务标记为只读事务,此时在这个事务里再执行insert、update、delete等DML语句就会出现如上的异常信息。
解决方案为:通过修改MySQL的事务隔离级别实现,查看当前MySQL数据库的事务隔离级别,输入命令 “ show variables like ‘transaction_%’; ” 。 将隔离级别修改为 -> READ-COMMITTED 即可,输入命令 “ SET GLOBAL transaction_isolation=‘READ-COMMITTED’; ” 即可解决该问题了。
最后以上两种方案都试过仍然不能解决问题,最后通过打断点到insert into t_nos_rms_route_line_code (关联表)操作时就没有出现此问题。还有我通过只能去掉事务的方法也没有出现此问题,但是偶尔在保存修改成功后刷新数据列表时出现以下错误: java修改操作出错:could not retrieve transation read-only status server_第1张图片
以上错误表示查询下标越界了,我想原由还是在修改保存时出了问题,即在刷新数据列表时,修改操作还未完成。后来在前台刷新列表加上延时setTimeout即可以解决此问题。结合代码分析发现insert into t_nos_rms_route_line_code (关联表)操作之前的逻辑删除t_nos_rms_route_line_code 表数据耗时较长导致,也就是这个操作还未完成,程序就已要执行下面的操作了,当然出错啦。

三、问题解决

将因逻辑删除关联表t_nos_rms_route_line_code 表数据耗时较长,加上当前线程休眠50毫秒解决,如下图:
在这里插入图片描述

你可能感兴趣的:(数据库,Java深入)