自动更新多个行 - java

我需要执行选择,然后以原子方式更新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-这将需要最少的代码更改,但有很大的缺点。与大多数应用程序一样,它的工作原理是读而不是写:锁定表将防止所有其他用户查看数据,并且代码可能会挂起,并等待连接超时之前释放锁踢并引发异常。

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

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

Java:在PreparedStatement(JDBC)中将null传递为long - java

我有一个变量是Long val = null; 而且我正在寻找一种将其传递给PreparedStatement语句对象的方法,以便将数据库中的字段值设置为null。statement.setLong(1,val); 它对Long无效,而对Long则无效。任何输入的想法或建议。谢谢 !!! 参考方案 您应该使用setNull method。statement.…

JAVA:字节码和二进制有什么区别? - java

java字节代码(已编译的语言,也称为目标代码)与机器代码(当前计算机的本机代码)之间有什么区别?我读过一些书,他们将字节码称为二进制指令,但我不知道为什么。 参考方案 字节码是独立于平台的,在Windows中运行的编译器编译的字节码仍将在linux / unix / mac中运行。机器代码是特定于平台的,如果在Windows x86中编译,则它将仅在Win…

java:继承 - java

有哪些替代继承的方法? java大神给出的解决方案 有效的Java:偏重于继承而不是继承。 (这实际上也来自“四人帮”)。他提出的理由是,如果扩展类未明确设计为继承,则继承会引起很多不正常的副作用。例如,对super.someMethod()的任何调用都可以引导您通过未知代码的意外路径。取而代之的是,持有对本来应该扩展的类的引用,然后委托给它。这是与Eric…

Java:BigInteger,如何通过OutputStream编写它 - java

我想将BigInteger写入文件。做这个的最好方式是什么。当然,我想从输入流中读取(使用程序,而不是人工)。我必须使用ObjectOutputStream还是有更好的方法?目的是使用尽可能少的字节。谢谢马丁 参考方案 Java序列化(ObjectOutputStream / ObjectInputStream)是将对象序列化为八位字节序列的一种通用方法。但…

Java-如何将此字符串转换为日期? - java

我从服务器收到此消息,我不明白T和Z的含义,2012-08-24T09:59:59Z将此字符串转换为Date对象的正确SimpleDateFormat模式是什么? java大神给出的解决方案 这是ISO 8601标准。您可以使用SimpleDateFormat simpleFormat = new SimpleDateFormat("yyyy-MM…