MySQL JDBC:InnoDB死锁后是否有自动重试选项?

9

我正在处理MySQL错误“尝试获取锁时发现死锁;请重试事务”

我发现可以安全地重新尝试该事务。

死锁并不危险。只需再次尝试即可。
http://dev.mysql.com/doc/refman/5.0/en/innodb-deadlocks.html

有一个单独的“超级插入..选择”语句,它在选择两个其他表的联接组合并在瓶颈表上使用子语句条件后插入到瓶颈表中,并在几个小表中使用。

瓶颈是“等待锁定”,毫无疑问正在等待写锁定。InnoDB似乎非常适合(写重表)。对于这个语句的犹豫现在全部消失了。

但现在问题出现了:每执行100次该语句,大约会有1-2次失败,原因是死锁。我认为死锁只发生在“超级插入..选择”的实例之间。我将安装该语句的自动重试,但我想知道:
问题:MySQL JDBC是否具有在接收异常后启用语句自动重试的选项,还是我必须编写自己的代码来实现?
com.mysql.jdbc.exceptions.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction

在这种情况下,我没有开始事务或停止事务命令。只有一个“超级插入...选择”语句。
1个回答

5
你可以重复执行该语句,但在一个完美的世界中,你应该回滚你的事务并重新开始。在那个世界里,你的事务应该是短暂的 :)

@GeorgeBailey 答案是重试整个事务,而不仅仅是语句。 - user207421

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接