我正在通过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
我用谷歌搜索,我没有找到有效的解决方案。 如果有的话,请帮助我找到解决方案或替代方案。
谢谢
答案 0 :(得分:0)
正如@ bodi0所指出的,MySQL参考手册(14.2.7.9. How to Cope with Deadlocks)对如何诊断死锁以及如何处理它们提出了很多建议。
在这种情况下,我可以想到两种可能的解释:
您正在解决由其他数据库连接或其他数据库客户端执行的其他事务的死锁问题。
datalist
中的条目具有相同的{ID, X, Y}
值,因此您最终会为批次添加同一行或多行的多个删除。也许这导致MySQL试图两次锁定同一行,并导致死锁。 (只是一个理论......)
但更好的想法是为自己诊断死锁。