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

Understanding how to handle deadlocks and their rollbacks in InnoDB

我过去主要使用MyISAM作为存储引擎,直到最近才更多地使用InnoDB;现在我真正开始使用 InnoDB 的 lockingisolation levels.

我一直在阅读 documentation and one thing that concerns me is that it states:

InnoDB automatically detects transaction deadlocks and rolls back a transaction or transactions to break the deadlock.

所以换句话说,一些 应该 到 运行 的代码由于死锁而被回滚,突然间你的数据完整性就出问题了,因为所述代码没有 运行!?

They also state 即:

Normally, you must write your applications so that they are always prepared to re-issue a transaction if it gets rolled back because of a deadlock.

问题是它没有解释如何重新发出查询或测试它们是否因死锁而失败?

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

有人可以在这里向我解释处理这个问题的最佳方法是什么,或者我是否误解了什么。

some code that was supposed to run got rolled back because of a deadlock

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

一定要检查错误,即使是 BEGINCOMMIT

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

注意不要陷入死循环。 (例如,如果您 "loop until no error",并且错误不是 "deadlock",例如 "connection lost"。)

如果您一次连接的用户从不超过一个,死锁是不可能的,但其他错误,有些是暂时的,是可能的。

至于isolation levels,我建议保持默认。只有当您进入高交易率并且正在做特殊的事情时,您才需要更改级别。