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