当前位置: 首页 > news >正文

MySQL报Lock wait timeout exceeded; try restarting transaction

背景

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

报错

### 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语句的执行时间。

相关文章:

  • 门户资源分享网站模板杭州网站推广公司
  • 免费网站建站深圳的seo网站排名优化
  • 网站怎么做背景seo网站培训优化怎么做
  • php网站制作工具抖音推广公司
  • 做外贸的网站有何用处东莞seo排名公司
  • 贵州省贵州省建设厅网站google付费推广
  • stm32+esp8266+机智云手机app
  • 《深度解析LightGBM与MySQL数据集成:高效机器学习的新范式》
  • 【Java设计模式】第5章 工厂方法模式讲解
  • 通过Aop实现限制修改删除指定账号的数据
  • QML Loader:动态加载与控件创建
  • git命令
  • LLM面试题十
  • EmotiVoice 易魔声AI语音下载安装使用教程​(附安装包)
  • 移动端、PC端(Web) 和 桌面端(客户端应用)AI驱动测试实现方案
  • Spring-MVC
  • 从C语言到Go语言:新手快速入门指南
  • 解析 LILIkoi 光纤力传感器:FBG 原理铸就耐高温抗干扰优势
  • python-Leetcode 65.搜索旋转排序数组
  • 知识表示方法之六:过程表示法(Procedural Representation)
  • 【AI】prompt engineering
  • 组播网络构建:IGMP、PIM 原理及应用实践
  • Java Arrays工具类详解
  • 2025 年福建交安安全员考试:结合本省交通特点备考​
  • 大模型ui设计SVG输出
  • STM32——I2C通讯(软件模拟)