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语句的执行时间。
相关推荐
不好听6133 分钟前
向量数据库:Milvus 与 MySQL 的本质差异
数据库
用户0942485680315 分钟前
第18章:Mongo复制集运维——故障切换、节点扩容与数据重同步
数据库·mongodb
Bug收容所28 分钟前
12305项目学习day5
java·spring boot·redis·mysql·spring·rocketmq
智码看视界35 分钟前
Day33-数据层 × 中间件AI化篇:Redis缓存经典问题-击穿、穿透、雪崩的终极解决方案
数据库·redis·缓存·中间件·穿透·雪崩·击穿
会编程的土豆1 小时前
功能详解 01 · 用户注册:从表单到数据库一行
开发语言·数据库·后端·mysql·golang
夏贰四1 小时前
数据资产平台如何落地企业数据分级合规管控?数据资产平台怎样满足行业数据监管审查要求?
大数据·数据库·人工智能
吴声子夜歌1 小时前
MongoDB 4.2——聚合框架
数据库·mongodb
墨神谕1 小时前
认识一下Unicode(统一码)
android·java·数据库
xywww1682 小时前
Claude Opus 5 API 接入实战:国内项目上线前的网络、Key、限流和排错清单
大数据·linux·网络·数据库·云计算·aws
yuezhilangniao2 小时前
某专科医院老数据库迁移实战记录-Oracle10g sqlserver2008等
数据库