2011-08-08 28 views
9

Working around MySQL error “Deadlock found when trying to get lock; try restarting transaction”MySQL JDBC:在InnoDB死锁之后是否有自动重试的选项?

我发现,该交易可以安全地重新尝试

死锁不危险的。再试一次。
http://dev.mysql.com/doc/refman/5.0/en/innodb-deadlocks.html

有一个单一的“超级insert..select”上的瓶颈表中选择其他两个表的连接组合,并使用子报表的条件,以及一个后插入瓶颈TABLE语句几张小桌子。

瓶颈是“等待锁”,它正在等待写锁定毫无疑问。 InnoDB看起来非常合适。 (对于书写繁多的表格)而这一个陈述的犹豫现在都消失了。

但是现在问题出现了:对于语句的每100次执行,大约1或2个语句会因为死锁而失败。我相信死锁只发生在“super insert..select”的实例之间。我将安装该声明的自动重试,但我不知道

问:用MySQL JDBC有一个选项,收到异常后打开报表的自动重试,还是我写我自己的代码那?

com.mysql.jdbc.exceptions.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction 

在这种情况下,我没有启动事务或停止事务命令。只需要一个“超级插入...选择”语句

回答

5

您可以重复该声明,但在完美的世界中,您应该回滚事务并重新启动它。而你的交易将在那个世界短暂:)

+3

我认为答案是否定的。 –

+0

@GeorgeBailey答案是重试整个交易,而不仅仅是声明。 – EJP