mysql并发插入死锁_高并发下insert死锁 · Issue #ITUNR · baomidou/mybatis-plus - Gitee.com...

本文介绍了一个关于SpringBoot应用中并发处理每日答题记录时遇到的MySQL锁等待超时问题。具体表现为在检查用户是否已答题并插入新记录的过程中,因高并发导致的数据库锁等待超时错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

当前使用版本(必须填写清楚,否则不予处理)

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值