批处理DELETE准备语句MYSQL中发现DeadLock错误

时间:2014-01-03 13:30:23

标签: java mysql jdbc

我正在通过JDBC预处理语句删除表中超过90k行。

我的代码如下所示:

 //Open JDBC Connection
 //MYSQl QUERY 
 String fetchDataSQL="DELETE FROM MYTABLE WHERE ID=? AND X=? AND Y=?";
preparedStatement = dbConnection.prepareStatement(fetchDataSQL);
rs = preparedStatement.executeQuery();
dbConnection.setAutoCommit(false);

for (Data dt : dataList) {
     preparedStatement.setLong(1, dt.getID());
     preparedStatement.setLong(2, dt.getX());
     preparedStatement.setLong(3, dt.getY());
     preparedStatement.addBatch();
}
preparedStatement.executeBatch();
dbConnection.commit();

//cose prepared statement
//close connection

这里dataList包含超过90k的记录,我想要删除。我已经将mysql索引应用于MYTABLE的id,X,Y

不幸的是我收到了错误

Deadlock found when trying to get lock; try restarting transaction

我用谷歌搜索,我没有找到有效的解决方案。 如果有的话,请帮助我找到解决方案或替代方案。

谢谢

1 个答案:

答案 0 :(得分:0)

正如@ bodi0所指出的,MySQL参考手册(14.2.7.9. How to Cope with Deadlocks)对如何诊断死锁以及如何处理它们提出了很多建议。

在这种情况下,我可以想到两种可能的解释:

  • 您正在解决由其他数据库连接或其他数据库客户端执行的其他事务的死锁问题。

  • datalist中的条目具有相同的{ID, X, Y}值,因此您最终会为批次添加同一行或多行的多个删除。也许这导致MySQL试图两次锁定同一行,并导致死锁。 (只是一个理论......)

但更好的想法是为自己诊断死锁。