【发布时间】: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