java - 使用preparedStatement select 时更新数据库

标签 java prepared-statement

我使用 PreparedStatement 从 MS SQL 数据库中选择数据子集。 在迭代结果集时,我还想更新行。目前我使用这样的东西:

prepStatement = con.prepareStatement(
                    selectQuery,
                    ResultSet.TYPE_FORWARD_ONLY,
                    ResultSet.CONCUR_UPDATABLE);


 rs = prepStatement.executeQuery();

while(rs.next){
rs.updateInt("number", 20)
rs.updateRow();
}

数据库已更新为正确的值,但出现以下异常:

Optimistic concurrency check failed. The row was modified outside of this cursor.

我已在 Google 上搜索过,但未能找到有关该问题的任何帮助。

如何防止此异常?或者既然程序确实做了我想要它做的事情,我可以忽略它吗?

最佳答案

从数据库中检索记录(通过光标)到您尝试将其保存回来的那一刻,该记录已被修改。如果number列可以独立于记录的其余部分独立于已设置 number 的其他进程进行安全更新。列到其他一些值,您可能会想做:

con.execute("update table set number = 20 where id=" & rs("id") )

但是,竞争条件仍然存在,并且您的更改可能会被另一个进程覆盖。

最好的策略是忽略异常(记录未更新),可能将失败的记录推送到队列(在内存中),然后进行第二次传递 失败的记录(重新评估 query 中的条件并根据需要进行更新 - 添加 number <> 20 作为 query 中的条件之一,如果情况尚未如此。)重复直到没有更多记录失败。最终所有记录都会被更新。

关于java - 使用preparedStatement select 时更新数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/617831/

相关文章:

java - 检查 TreeMap 是否包含对象,并遵守更通用的规范?

java - 如何部署混合 C++/Java (JNI) 应用程序?

gRPC/protobuf( Protocol Buffer )的 Java IDL

java - 生成 1 到 10 之间的随机数 Java

php mysqli 使用通配符准备语句

java - 当确认更新行时,为什么我的PreparedStatement.executeUpdate 返回 0?

java - 在 Java 的 PreparedStatement 中使用大于或等于 (>=)

java - 在外部 jar 中查找文件而不是在我的类路径中

oracle alter session查询的Java准备语句参数

java - 使用PreparedStatement在Java INSERT INTO命令中保留列名变量?