Oracle数据库SELECT ... FOR UPDATE with autocommit on

时间:2015-01-28 06:11:57

标签: java oracle jdbc oracle11g

我正在针对Oracle数据库(11g)运行此查询。该连接具有autocommit的默认值,即' true'。

Connection con = driver.connect(url, properties);
String query = "SELECT EMPID, NAME FROM EMPLOYEE FOR UPDATE";

Statement statement = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
ResultSet resultSet = statement.executeQuery(query);

SELECT... FOR UPDATE表示它会锁定所选行,以便在您结束交易之前其他用户无法锁定或更新行。"使用autocommit应该在执行查询后立即执行。但锁定存在直到连接关闭。

(我在sqlplus上运行查询select * FROM DBA_DML_LOCKS WHERE NAME = 'EMPLOYEE';检查了这一点。)

这是一个错误还是有人请解释原因? 提前谢谢。

3 个答案:

答案 0 :(得分:3)

正如documentation所说:

  

默认情况下,SQL语句在完成时提交,而不是在执行时提交。检索到所有结果集和更新计数后,语句即完成。但是,在几乎所有情况下,语句都会在执行后立即完成并因此被提交

另一个documentation

  

启用自动提交可能更方便,但可以减少控制。例如,您无法回滚更改。此外,某些SQLJ或JDBC功能与自动提交模式不兼容。例如,您必须禁用更新批处理的自动提交标志或SELECT FOR UPDATE语法才能正常工作。

因此,对于此查询类型,您应该使用手动提交

答案 1 :(得分:1)

我找到了这份文件。

FOR UPDATE clause其中:使用FOR UPDATE子句不是获取可更新JDBC ResultSet的必需条件。只要用于生成JDBC ResultSet的语句满足可更新游标的要求,生成JDBC ResultSet的JDBC语句就足以使ResultSet的并发模式ResultSet.CONCUR_UPDATABLE可以更新。

这一个:Requirements for updatable cursors and updatable ResultSets

我假设您可以跳过案例中的FOR UPDATE条款。

答案 2 :(得分:1)

请参阅此常见问题解答。使用FOR UPDATE时,应关闭AutoCommit。 http://www.oracle.com/technetwork/database/enterprise-edition/jdbc-faq-090281.html#30_06