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

时间:2015-04-15 08:17:14

标签: mysql transactions innodb database-deadlocks

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

我一直在阅读documentation,关注我的一件事是it states

  

InnoDB会自动检测事务死锁并回滚事务或事务以打破僵局。

所以换句话说,一些假定运行的代码由于死锁而被回滚,并且突然之间你的数据完整性已经消失,因为所说的代码没有运行!?< / p>

They also state

  

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

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

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

所以有人可以在这里向我解释一下,解决这个问题的最佳方法是,或者我是否误解了某些事情。

1 个答案:

答案 0 :(得分:2)

  

一些应该运行的代码由于死锁而被回滚

真。因此,您的下一个引用需要重新运行。重新运行交易涉及您的代码返回START TRANSACTION然后再试一次。重新发布不是自动的;你确实需要额外的代码。

请务必检查错误,即使是BEGINCOMMIT

也是如此

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

小心不要陷入无限循环。 (例如,如果你“循环直到没有错误”,并且错误不是“死锁”,例如“连接丢失”。)

如果您一次只能连接多个用户,则死锁是不可能的,但其他错误(有些是短暂的)是可能的。

对于isolation levels,我建议将其保留为默认值。只有当你进入高交易率并做特殊事情时,你才需要改变水平。