我正在用Java开发一个客户端。它通过操作与服务器通信。动作是类似社交的动作(动作的一个例子是用户查看另一个用户的配置文件)。
在上面的View Profile示例中,客户端执行4个查询以从数据库服务器获取数据。为了提供一致性,我希望将这4个查询放在一个事务中。
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个查询组合到一个查询中时,我可以实现一致性。
我的问题是,当我想向数据库管理系统发出单独的查询时,在Java语言中设置autoCommit真的可以处理读事务吗?如果不是,如果我想要在4个单独的查询中查询DBMS,我如何提供一致性?
仅供参考,我使用的数据库服务器是Oracle DB。
发布于 2014-09-12 18:50:25
对于oracle,selects从不进行脏读,因此总是隐式TRANSACTION_READ_COMMITTED。如果您以很高的速率摄取数据,我的猜测是数据在第一次和最后一次select之间发生了变化,因此您最好的选择是使用3个联合将select合并为一个。
请参阅http://www.oracle.com/technetwork/issue-archive/2005/05-nov/o65asktom-082389.html
https://stackoverflow.com/questions/25798699
复制相似问题