如何在Java中处理读事务以提供一致性?

时间:2014-09-11 23:55:20

标签: java sql database transactions consistency

我正在Java开发一个客户端。它通过操作与服务器通信。操作是类似社交的操作(操作的示例是用户查看另一个用户的配置文件)。

使用上面的View Profile示例,客户端执行4次查询以从数据库服务器获取数据。为了提供一致性,我想将4个查询放在一个事务中。所以在我的View Profile函数中,首先放置conn.setAutoCommit(false),然后查询数据,最后在返回之前我再次将auto commit设置为true conn.setAutoCommit(true)(参见下面的代码片段)。

try {
  // set auto commit to false to manually handle transaction
  conn.setAutoCommit(false);

  // execute query 1 
  // ...

  // execute query 2
  // ...

  // execute query 3
  // ...

  // execute query 4
  // ...

  // set auto commit to true again to not affect other actions
  conn.setAutoCommit(true);
} catch (SQLException e) {
  e.printStackTrace(System.out);
} finally {
  try {
    conn.close();
  } catch (SQLException e) {
    e.printStackTrace(System.out);
  }
}

但是,当我运行代码时,有时我会注意到从此操作返回的数据不一致。当我尝试在单个查询中组合4个查询时,我可以实现一致性。

我的问题是,当我想向DBMS发出单独的查询时,在我的示例中设置Java中的autoCommit是否真的适用于读取事务?如果不是,如果我想在4个单独的查询中查询DBMS,我该如何提供一致性?

仅供参考,我使用的数据库服务器是Oracle DB。

1 个答案:

答案 0 :(得分:1)

对于oracle,选择永远不会执行脏读,因此总是隐式地使用TRANSACTION_READ_COMMITTED。如果您以高速率摄取数据,我的猜测是数据在第一个和最后一个选择之间发生变化,因此您最好的选择是使用3个UNION将选择合并为一个。

请参阅http://www.oracle.com/technetwork/issue-archive/2005/05-nov/o65asktom-082389.html