MySQL报Lock wait timeout exceeded; try restarting transaction

背景

有个定时任务特别耗时,涉及到了一个表,此时平台页面触发一个该表的操作,请求卡顿了几十秒,最后返回了一个500异常。

报错

java 复制代码
### Error updating database.  Cause: com.mysql.cj.jdbc.exceptions.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction
### The error may exist in com/xxx/xxx/xxx/xxxMapper.java (best guess)
### The error may involve com.xxx.xxx.xxx.xxxMapper.update-Inline
### The error occurred while setting parameters
### SQL: UPDATE table  SET update_time=?,task_status=?    WHERE  delete_flag=0  AND (id = ? AND task_status <= ?)
### Cause: com.mysql.cj.jdbc.exceptions.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction
; Lock wait timeout exceeded; try restarting transaction; nested exception is com.mysql.cj.jdbc.exceptions.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction

解决

问题的关键是多个线程来竞争同一把锁导致的,InnoDB的锁默认等待时间innodb_lock_wait_timeout=50秒,如何避免一个线程拿到锁的时间太长便是我们的重中之重。

  • 修改innodb_lock_wait_timeout的值,无疑是杯水车薪,治标不治本。
  • 先根据报错日志找到这两条SQL语句的具体操作,分析是否有耗时现象,是否存在长事务问题(加了@Transactional,我这块就是这个原因导致的)。
  • 或者执行show engine innodb status,查看是否有锁等待/死锁信息,都可以找到是哪条SQL导致的。
  • 如果还不行,就需要适当优化索引了,宗旨就是减少SQL语句的执行时间。
相关推荐
wjhx3 分钟前
QT中对蓝牙权限的申请,整理一下
java·数据库·qt
冰暮流星14 分钟前
javascript之二重循环练习
开发语言·javascript·数据库
万岳科技系统开发39 分钟前
食堂采购系统源码库存扣减算法与并发控制实现详解
java·前端·数据库·算法
冉冰学姐1 小时前
SSM智慧社区管理系统jby69(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·管理系统·智慧社区·ssm 框架
杨超越luckly1 小时前
HTML应用指南:利用GET请求获取中国500强企业名单,揭秘企业增长、分化与转型的新常态
前端·数据库·html·可视化·中国500强
斯普信专业组1 小时前
构建基于MCP的MySQL智能运维平台:从开源服务端到交互式AI助手
运维·mysql·开源·mcp
Elastic 中国社区官方博客1 小时前
Elasticsearch:Workflows 介绍 - 9.3
大数据·数据库·人工智能·elasticsearch·ai·全文检索
仍然.1 小时前
MYSQL--- 聚合查询,分组查询和联合查询
数据库
一 乐1 小时前
校园二手交易|基于springboot + vue校园二手交易系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端
啦啦啦_99991 小时前
Redis-0-业务逻辑
数据库·redis·缓存