[英]Understanding how to handle deadlocks and their rollbacks in InnoDB
过去,我主要将MyISAM
用作存储引擎,而最近才更多地使用InnoDB
。 现在我真的开始使用InnoDB的locking
和isolation levels
。
InnoDB自动检测事务死锁并回滚一个或多个事务以打破死锁。
因此,换句话说,由于死锁,原本应该运行的某些代码被回滚了,突然之间,由于所说的代码未运行,您的数据完整性就消失了!
他们还指出:
通常,您必须编写应用程序,以便在由于死锁而使事务回滚时,它们始终准备重新发出事务。
难道没有解释如何重新发出查询或测试是否由于死锁而失败吗?
在我看来,这是一个重要的问题,您期望运行的某些代码(查询将被执行)可能会被回滚而不重新发出),而无需添加额外的代码来避免这种情况。 这不是自动的吗?
因此,有人可以在这里向我解释解决此问题的最佳方法是什么,或者如果我误解了什么。
由于死锁,一些本应运行的代码被回滚了
真正。 因此,关于需要重新运行的下一个报价。 重新运行事务需要您的代码返回到“ START TRANSACTION
试。 重新发行不是自动的; 您确实需要额外的代码。
确保检查错误,即使在BEGIN
和COMMIT
。
至于代码是什么样子...取决于您使用的API。 有些已经具有try/catch
语法; 有些没有。
注意不要陷入无限循环。 (例如,如果“循环直到没有错误”,而错误是“死锁”以外的其他错误,例如“连接丢失”。)
如果一次连接的用户数量不超过一个,则死锁是不可能的,但其他错误(可能是暂时的)也是可能的。
至于isolation levels
,建议将其保留为默认值。 仅当您进入高交易率并且正在做特殊事情时,才需要更改级别。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.