gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 05:17:10 25 4
gpt4 key购买 nike

我使用 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/

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