首页 > 解决方案 > InnoDB 死锁历史

问题描述

更改代码后,我的数据库报告了很多死锁事件,这些事件在一段时间后得到解决(1 < x < 5 分钟)。我SHOW ENGINE INNODB STATUS用来查看发生了什么但信息不正确:此处报告的语句和表格与我在INNODB_LOCKS表格中看到的不同(尚未解决时)。

问题是:我怎样才能获得发生死锁的历史记录?不只是最近的一个。

标签: mariadbinnodbdatabase-deadlocks

解决方案


innodb_print_all_deadlocks = ON

SHOW ENGINE INNODB STATUS是短暂的;上面应该通过写入日志文件来持久化它。

我建议采取一些措施来减少死锁的数量:

  • 在不同的事务中做的事情是相同的顺序。这包括触摸了哪些行。
  • 加快代码速度。(更好的索引,通常是“复合”,重新制定查询等)
  • BEGIN看看是否可以合理地从...中拉出任何东西COMMIT

如需进一步讨论,请向我们展示事务中的 SQL,以及SHOW CREATE TABLE相关表。

在任何情况下,都要在每个事务中测试错误,并在遇到死锁时准备好重播。

注: lock_wait_timeout是相关项目。它默认为不合理的高 50 秒。如果你提出这个问题,你就是在自找更多麻烦。减少它(比如说,5)不是一个真正的解决方案,但它可能会以有趣的方式改变问题。再次测试错误并对其做出反应。达到这个“超时”与“僵局”一样糟糕。不打它,而是等待,是 InnoDB 成功解决冲突的一种静默方式。


推荐阅读