MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction

遇到 MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction 这个错误时,通常意味着你的数据库事务在尝试获取一个锁时等待了太长时间。这通常发生在有长时间运行的事务持有锁,而其他事务在等待这个锁时超过了锁等待超时的时间。要解决这个问题,你可以按照以下步骤进行排查和解决

1. 确定哪个事务持有锁

首先,需要找出哪个事务持有了锁并导致其他事务等待。你可以通过运行以下SQL命令来查看当前的锁情况:

 

sql

SHOW ENGINE INNODB STATUS;

这个命令会显示InnoDB的许多内部运行信息,包括锁等待和死锁信息。在输出的 LATEST DETECTED DEADLOCK 部分,你可以找到有关最近检测到的死锁的信息。在 TRANSACTIONS 部分,你可以看到当前正在运行的事务及其锁定状态。

2. 分析长时间运行的查询

通过分析长时间运行的查询,你可以确定是哪些查询可能导致了锁等待超时。运行以下命令查看长时间运行的事务:

sql

SELECT * FROM information_schema.innodb_trx ORDER BY trx_started;

这将列出当前运行的所有InnoDB事务及其开始时间。

3. 终止长时间运行的事务

如果确定某个事务是导致锁等待超时的原因,且该事务是可以安全中断的,你可以通过杀死该事务来释放其持有的锁

执行 sql  KILL 线程 ID;

线程id也就是步骤2 查出来的trx_mysql_thread_id;

4.调整等待时间

SET GLOBAL innodb_lock_wait_timeout = 120; -- 全局设置
SET SESSION innodb_lock_wait_timeout = 120; -- 当前会话设置
 

  • 12
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值