gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 06:28:09 26 4
gpt4 key购买 nike

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

我一直在阅读 documentation我关心的一件事是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 语法;有些没有。

注意不要陷入死循环。 (例如,如果您“循环直到没有错误”,并且错误不是“死锁”,例如“连接丢失”。)

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

至于隔离级别,我建议将其保留为默认值。只有当您进入高交易率并且正在做特殊的事情时,您才可能需要更改级别。

关于mysql - 了解如何处理 InnoDB 中的死锁及其回滚,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29645044/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com