当前位置: 首页 > 面试题库 >

自动更新多个行

东方乐
2023-03-14
问题内容

我需要执行选择,然后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所说,您应该研究使用事务来确保更新的原子性-
一个非常低级的示例是按照以下方式进行操作:

...
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)

但是,这不会解决您的第二个问题,即两个试图更新同一张表的竞争方法-竞争条件。我认为这里有两种主要方法-每种方法各有优缺点。

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

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

  • 该表的所有更新都通过单个类
  • 该类实现Singleton模式,或将update方法公开为Static方法
  • 更新方法利用Synchronized关键字来防止出现竞争情况


 类似资料:
  • autoUpdater模块为Squirrel框架提供了一个接口。 进程: 主进程​ 您可以使用这些项目之一进行快速启动多平台发布服务器以分发应用程序: nuts:为您的应用程序使用智能版本服务器,使用GitHub作为后端。使用Squirrel(Mac和Windows)自动更新 electron-release-server:功能齐全,自主托管的electron应用程序的发布服务器,兼容自动更新器

  • UpdateSoftDemo 是一款自动更新软件,脱离软件商店的自动更新,提示是否更新,有进度条,下载后自动提示安装。

  • 问题内容: 谁能给我一个方向,我想知道如何做自动更新页面,例如facebook具有新的状态更新,新的点赞等。即,如果您在窗口中打开状态并且用户单击“喜欢”, +1会自动出现。 提前致谢。 问题答案: 这些是使用PUSH模型(订阅/发布)完成的。 客户端首先通过发出AJAX请求进行订阅。该AJAX请求可以无限期地存活。当服务器收到新的点赞/评论时,它将此更新发布到客户端,从而结束AJAX请求。客户端

  • 问题内容: 在做一个小发布并将其标记之前,我想更新package.json以反映该程序的新版本。 有没有一种方法可以自动编辑文件? 需要帮助吗? 问题答案: 可能是正确的答案。只给一个替代我建议咕噜凸点。它由angular.js的一名成员维护。 用法: 如果仍然使用grunt,那可能是最简单的解决方案。

  • 您的SQL语法有错误;查看与您的MySQL服务器版本相对应的手册,了解正确的语法....

  • 问题内容: 我知道您可以一次插入多行,是否可以在MySQL中一次更新多行(如在一个查询中)? 编辑:例如,我有以下内容 我想将以下所有更新合并到一个查询中 问题答案: 是的,这是可能的-您可以在插入的键更新中使用INSERT…。 使用您的示例: