gpt4 book ai didi

java - 以原子方式更新多行

转载 作者:搜寻专家 更新时间:2023-11-01 02:56:28 24 4
gpt4 key购买 nike

我需要执行一个选择,然后以原子方式更新 ResultSet 中的一些行。

我使用的代码看起来像(简化):

stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
rs = stmt.executeQuery("SELECT ...");

while (rs.next()) {
if (conditions_to_update) {
rs.updateString(...);
rs.updateRow();
}
}
  • 我能保证更新将自动执行吗?如果不是,我怎么能保证?
  • 如果任何其他进程更改了您正在通过 updateRow() 更新的数据库行,会发生什么情况?有什么方法可以锁定 ResultSet 中的行?

最佳答案

可能有一大堆技术和概念在这里发挥作用,当您开始考虑多线程/多请求应用程序时,事情开始变得相当棘手。

正如 Iassevk 所说,您应该考虑使用 Transactions确保更新的原子性 - 一个非常低级的例子是按照以下方式做一些事情:

...
con.setAutoCommit(false);
try {
while (rs.next()) {
if (conditions_to_update) {
rs.updateString(...);
rs.updateRow();
}
}
con.setAutoCommit(true);
} catch (Exception ex) {
//log the exception and rollback
con.rollback();
} finally {
con.close();
}

然后所有更新将被分批放入同一个事务中。如果任何更新产生了异常(例如无效值或结果中途连接失败),整个批处理将被回滚。 (最后添加,因为我是它的拥护者;p)

但是,这不会解决您的第二个问题,即尝试更新同一张表的两种竞争方法 - 竞争条件。在我看来,这里有两种主要方法 - 每种方法都有其优点和缺点。

最简单的方法是 Lock the table - 这将需要最少的代码更改,但有一个很大的缺点。假设与大多数应用程序一样,读取比写入更多:锁定表将阻止所有其他用户查看数据,代码可能会挂起,等待连接超时前释放锁启动并抛出异常。

更复杂的方法是确保执行这些更新的方法以线程安全的方式实现。为此:

  • 此表的所有更新都通过一个类传递
  • 该类实现单例模式,或将更新方法公开为静态方法
  • 更新方法利用 Synchronized防止竞争条件的关键字

关于java - 以原子方式更新多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/211399/

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