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语句的执行时间。
相关推荐
八股文领域大手子30 分钟前
《从单体到分布式:一个订单系统的架构升级》
java·数据库·spring·缓存·mybatis
何似在人间5751 小时前
Seata 支持哪些模式的分布式事务?
分布式·mysql·seata·分布式事务
江沉晚呤时1 小时前
深入探析C#设计模式:访问者模式(Visitor Pattern)的原理与应用
java·服务器·开发语言·数据库·.netcore
老大白菜1 小时前
mysql 商城商品属性开发的动态解决方案
数据库·mysql
tpoog1 小时前
[MySQL] 表的增删查改(查询是重点)
linux·数据库·mysql·算法·贪心算法
博睿谷IT99_2 小时前
2025年考OCP认证有用吗?
数据库·oracle·开闭原则·ocp认证·程序员人生
阳光九叶草LXGZXJ3 小时前
达梦数据库-学习-18-ODBC数据源配置(Linux)
linux·运维·数据库·sql·学习·oracle
运维之美@3 小时前
达梦数据库迁移问题总结
运维·服务器·数据库
EelBarb3 小时前
mysql:重置表自增字段序号
数据库·mysql
我科绝伦(Huanhuan Zhou)4 小时前
Kingbase 常用运维命令总结
运维·数据库·oracle