java - Oracle 数据库 SELECT ... FOR UPDATE 自动提交

标签 java oracle jdbc oracle11g

我正在针对 Oracle 数据库 (11g) 运行此查询。连接具有自动提交的默认值,即“真”。

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声明它“锁定选定的行,以便其他用户在您结束交易之前无法锁定或更新这些行。”使用自动提交应该在查询执行后立即进行。但是在连接关闭之前锁一直存在。

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

这是一个错误还是有人可以解释为什么? 提前谢谢你。

最佳答案

documentation 中所述:

the default is for a SQL statement to be committed when it is completed, not when it is executed. A statement is completed when all of its result sets and update counts have been retrieved. In almost all cases, however, a statement is completed, and therefore committed, right after it is executed

另一个documentation :

Enabling auto-commit may be more convenient, but gives you less control. For example, you have no option to roll back changes. In addition, some SQLJ or JDBC features are incompatible with auto-commit mode. For example, you must disable the auto-commit flag for update batching or SELECT FOR UPDATE syntax to work properly.

所以对于这种查询类型你应该使用手动提交

关于java - Oracle 数据库 SELECT ... FOR UPDATE 自动提交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28185811/

相关文章:

java - 不使用 native SQL 查询的正则表达式查询 - JPA

java - stringByEvaluatingJavascriptFromString(iOS 方法,Android 等效方法是什么?)

java - ThreadExecutor 强制无限循环中执行线程

java - 创建菜单资源会抛出 IllegalStateException

java - 按日期过滤的 Spring JDBC 模板 SQL 查询

java - 使用 IN(...) 子句构建选择查询

给定底层数据库最大连接设置的java最佳jdbc池大小

sql - 带空格的 Oracle 表列名

java - 创建目录 Oracle/JDBC 失败

mysql - 前导逗号还是尾随逗号?