死锁后重启MySQL中的事务

时间:2011-08-03 11:31:38

标签: mysql transactions deadlock

我的MySQL遇到了僵局。如何配置MySQL以在遇到死锁时自动重启事务?

4 个答案:

答案 0 :(得分:6)

由于发生了死锁,您无法自动执行此操作,因为两个事务正在尝试修改相同数据。如果你知道只是再次重试相同的语句将是正确的事情,你需要在你的应用程序中实现它。

但是让数据库自动执行此操作将是不负责任的,因为在发出可能已修改的语句(如果有的话)之前,您的应用程序首先需要先查看数据库中的新情况。

答案 1 :(得分:3)

  

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

http://dev.mysql.com/doc/refman/5.1/en/innodb-deadlocks.html

手册表明不存在这样的配置选项。

答案 2 :(得分:3)

重新启动交易意味着:

  • (可选)启动新的数据库连接句柄;
  • 执行第一个启动新事务的函数/行代码,并重试整个执行路径,直到commit

因为数据库引擎不可能知道在发生死锁之后会执行的查询,所以它无法为您重试整个事情(更不用说可能存在可能基于新更改的数据库执行不同查询的应用程序逻辑数据)。

答案 3 :(得分:0)

嗯,你不能,也没有意义。由您的应用程序来应对死锁以及它的完成方式在很大程度上取决于您的业务逻辑,例如:捕获异常,等待几秒钟,重试x次......