代码更改后,我的数据库报告了很多死锁事件,这些死锁事件在一段时间(1 INNODB_LOCKS
表中看到的内容(尚未解决)不同。
问题是:如何获得发生了什么死锁的历史和日志?不只是最近的一个。
答案 0 :(得分:1)
innodb_print_all_deadlocks = ON
SHOW ENGINE INNODB STATUS
是瞬态的;以上应该通过写入日志文件来持久保存。
我建议采取一些措施来减少死锁的数量:
BEGIN
... COMMIT
中抽出任何东西。为进一步讨论,请向我们显示事务中的SQL,并为相关表加SHOW CREATE TABLE
。
无论如何,请测试每个事务中的错误,并在遇到僵局时准备重播。
注意:lock_wait_timeout
是一个相关项目。默认为50秒。如果您提出来,您正在要求更多麻烦。将其减小(例如为5)不是真正的解决方案,但是它可能以有趣的方式改变问题。再次,测试错误并做出反应。击中“超时”与“死锁”一样糟糕。 InnoDB成功解决冲突是保持沉默的一种方式,它没有命中而是等待着。