gpt4 book ai didi

java - DeadLock 在批量 DELETE 预准备语句 MYSQL 中发现错误

转载 作者:行者123 更新时间:2023-11-30 00:51:53 24 4
gpt4 key购买 nike

我正在通过 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

不幸的是我遇到了错误

尝试获取锁时发现死锁;尝试重新启动事务

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

谢谢

最佳答案

正如 @bodi0 指出的,MySQL 引用手册 ( 14.2.7.9. How to Cope with Deadlocks ) 有很多关于如何诊断死锁以及如何处理死锁的建议。

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

  • 您因不同数据库连接或不同数据库客户端执行的某些其他事务而陷入死锁。

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

但更好的主意是自己诊断僵局。

关于java - DeadLock 在批量 DELETE 预准备语句 MYSQL 中发现错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20904797/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com