InnoDB死锁历史

时间:2018-11-20 11:45:45

标签: mariadb innodb database-deadlocks

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

问题是:如何获得发生了什么死锁的历史和日志?不只是最近的一个。

1 个答案:

答案 0 :(得分:1)

innodb_print_all_deadlocks = ON

SHOW ENGINE INNODB STATUS是瞬态的;以上应该通过写入日志文件来持久保存。

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

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

为进一步讨论,请向我们显示事务中的SQL,并为相关表加SHOW CREATE TABLE

无论如何,请测试每个事务中的错误,并在遇到僵局时准备重播。

注意:lock_wait_timeout是一个相关项目。默认为50秒。如果您提出来,您正在要求更多麻烦。将其减小(例如为5)不是真正的解决方案,但是它可能以有趣的方式改变问题。再次,测试错误并做出反应。击中“超时”与“死锁”一样糟糕。 InnoDB成功解决冲突是保持沉默的一种方式,它没有命中而是等待着。