繁体   English   中英

了解如何处理InnoDB中的死锁及其回滚

[英]Understanding how to handle deadlocks and their rollbacks in InnoDB

过去,我主要将MyISAM用作存储引擎,而最近才更多地使用InnoDB 现在我真的开始使用InnoDB的lockingisolation levels

我一直在阅读的文档和我所关心的是,一件事情它指出

InnoDB自动检测事务死锁并回滚一个或多个事务以打破死锁。

因此,换句话说,由于死锁,原本应该运行的某些代码被回滚了,突然之间,由于所说的代码未运行,您的数据完整性就消失了!

他们还指出:

通常,您必须编写应用程序,以便在由于死锁而使事务回滚时,它们始终准备重新发出事务。

难道没有解释如何重新发出查询或测试是否由于死锁而失败吗?

在我看来,这是一个重要的问题,您期望运行的某些代码(查询将被执行)可能会被回滚而不重新发出),而无需添加额外的代码来避免这种情况。 这不是自动的吗?

因此,有人可以在这里向我解释解决此问题的最佳方法是什么,或者如果我误解了什么。

由于死锁,一些本应运行的代码被回滚了

真正。 因此,关于需要重新运行的下一个报价。 重新运行事务需要您的代码返回到“ START TRANSACTION试。 重新发行不是自动的; 您确实需要额外的代码。

确保检查错误,即使在BEGINCOMMIT

至于代码是什么样子...取决于您使用的API。 有些已经具有try/catch语法; 有些没有。

注意不要陷入无限循环。 (例如,如果“循环直到没有错误”,而错误是“死锁”以外的其他错误,例如“连接丢失”。)

如果一次连接的用户数量不超过一个,则死锁是不可能的,但其他错误(可能是暂时的)也是可能的。

至于isolation levels ,建议将其保留为默认值。 仅当您进入高交易率并且正在做特殊事情时,才需要更改级别。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM