当前使用版本(必须填写清楚,否则不予处理)
springboot版本:2.0.3.RELEASE
mybatis版本:3.0.5
jdk:1.8
该问题是怎么引起的?(最新版上已修复的会直接close掉)
public Result getExamSetByExamId(@RequestParam("useTime")String useTime,
@RequestParam("openId")String openId,
@RequestParam("score")String score,
@RequestParam("isPass")Integer isPass,
@RequestParam("resultCount")Integer resultCount,
@RequestParam("answer")String answer){
try{
List resultToday = resultEverydayService.findResultToday(openId);
if(!resultToday.isEmpty()){
return ResultUtils.error(0001,"该账号已经答过题,请勿重复提交");
}
ResultEveryday resultEveryday = new ResultEveryday();
resultEveryday.setScore(Integer.valueOf(score)).setOpenId(openId).
setIsPass(isPass).setUseTime(useTime).setResultCount(resultCount);
resultEverydayService.save(resultEveryday);
resultDetailsEveryDay(resultEveryday.getResultId(),answer);
return ResultUtils.success(resultEveryday.getResultId());
}catch (Exception e){
log.error(openId+",提交每日答题失败,{}",e);
return ResultUtils.error(0001,"提交失败");
}
}
数据库操作有两次,第一次是查询
List resultToday = resultEverydayService.findResultToday(openId);
第二次是新增
resultEverydayService.save(resultEveryday);
操作的是同一张表,先查询是否已经有,没有的话进行新增
重现步骤
当并发的时候出现此类错误
报错信息
Error updating database. Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction
The error may involve com.mybatis.plus.mp.mapper.ResultEverydayMapper.insert-Inline
The error occurred while setting parameters
SQL: INSERT INTO mp_result_everyday ( open_id, use_time, is_pass, score, result_count ) VALUES ( ?, ?, ?, ?, ? )
Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction
; ]; Lock wait timeout exceeded; try restarting transaction; nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction