【问题标题】:How to handle read transaction in Java to provide consistency?如何处理 Java 中的读取事务以提供一致性?
【发布时间】:2014-09-11 23:55:20
【问题描述】:

我正在Java 开发一个客户端。它通过动作与服务器通信。动作是类似社交的动作(动作的一个例子是用户查看另一个用户的个人资料)。

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

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。

【问题讨论】:

  • 您可能需要设置事务隔离级别。
  • 你能解释清楚一点吗?如何以及在哪里设置级别?在 Java 客户端还是在 Oracle DB 服务器中?
  • 使用 Java 代码中的 Connection.setTransactionIsolation()。
  • 谢谢。我会测试并回复结果。希望它有效。
  • 我用两个选项 Connection.TRANSACTION_READ_COMMITTED 和 Connection.SERIALIZABLE 尝试了 conn.setTransactionIsolation() 但两者都不起作用。有什么建议吗?

标签: java sql database transactions consistency


【解决方案1】:

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

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

【讨论】:

  • 谢谢。使用 Union 是组合多个 SELECT 的好方法。我只是想知道是否有一些方法可以在 java 代码中单独调用 SELECT 并且仍然可以实现一致的读取。另一个问题是,在任何情况下,我们真的需要在单个事务中分离 SELECT 语句吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-12
相关资源
最近更新 更多