primefaces地更新多行

我需要执行一个select,然后以primefaces方式更新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(); } } 
  • 我可以保证更新将以primefaces方式执行吗? 如果没有,我怎么能保证?
  • 如果任何其他进程通过updateRow()更改了您正在更新的数据库行,会发生什么? 有没有办法锁定ResultSet的行?

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

正如Iassevk所说,您应该考虑使用事务来确保更新的primefaces性质 – 一个非常低级的示例是按照以下方式执行某些操作:

 ... 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(); } 

然后,所有更新将被批处理到同一事务中。 如果任何更新生成了exception(例如无效值或连接在结果中失败),则整个批次将被回滚。 (最后补充说因为我是它的冠军; p)

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

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

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

  • 该表的所有更新都通过一个类
  • 该类实现Singleton模式,或将更新方法公开为Static方法
  • 更新方法使用Synchronized关键字来防止竞争条件

使用交易。

如果任何其他进程通过updateRow()更改了您正在更新的数据库行,会发生什么? 有没有办法锁定ResultSet中的行?

在Oracle中,您可以通过发出以下SQL来标记某些行以进行更新。

 select cola, colB from tabA for update; 

尝试更新此行的下一个事务/线程/应用程序将获得exception。 有关详细信息,请参阅此处 – http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:4530093713805