mariadb - InnoDB 死锁历史
问题描述
更改代码后,我的数据库报告了很多死锁事件,这些事件在一段时间后得到解决(1 < x < 5 分钟)。我SHOW ENGINE INNODB STATUS
用来查看发生了什么但信息不正确:此处报告的语句和表格与我在INNODB_LOCKS
表格中看到的不同(尚未解决时)。
问题是:我怎样才能获得发生死锁的历史记录?不只是最近的一个。
解决方案
innodb_print_all_deadlocks = ON
SHOW ENGINE INNODB STATUS
是短暂的;上面应该通过写入日志文件来持久化它。
我建议采取一些措施来减少死锁的数量:
- 在不同的事务中做的事情是相同的顺序。这包括触摸了哪些行。
- 加快代码速度。(更好的索引,通常是“复合”,重新制定查询等)
BEGIN
看看是否可以合理地从...中拉出任何东西COMMIT
。
如需进一步讨论,请向我们展示事务中的 SQL,以及SHOW CREATE TABLE
相关表。
在任何情况下,都要在每个事务中测试错误,并在遇到死锁时准备好重播。
注: lock_wait_timeout
是相关项目。它默认为不合理的高 50 秒。如果你提出这个问题,你就是在自找更多麻烦。减少它(比如说,5)不是一个真正的解决方案,但它可能会以有趣的方式改变问题。再次测试错误并对其做出反应。达到这个“超时”与“僵局”一样糟糕。不打它,而是等待,是 InnoDB 成功解决冲突的一种静默方式。
推荐阅读
- ansible - 带有 include_variable 的 ansible 循环
- javascript - 使用@artsy/fresnel 框架的条件语句
- javascript - TypeError:response.type 不是函数
- python - PyInstaller 在使用 Langdetect 时出错
- html - 用于响应性的引导标签
- stm32 - ST 链接错误(DEV_TARGET_HELD_UNDER_RESET)
- javascript - 是否有与 Python 字符串常量等效的 Javascript?
- sql - 合并两个结果集
- jquery - jQuery - 在点击功能上循环 next()
- sql - 将具有不同日期的多行与重叠变量结合起来(以捕获第一个和最后一个更改日期)