addBatch()与autoCommit = true一起使用

我有这样的情况:

con.setAutoCommit(true); Statement stmt = con.createStatement(); stmt.addBatch(query);//add all the queries stmt.executeBatch(); 

每个查询是单独提交还是整个批处理都会有一次提交?

注意:数据库是Oracle 11

根据JDBC规范,启用自动提交的批处理执行的确切行为是实现定义的。 因此,它取决于数据库及其驱动程序,最好不要对确切的行为进行假设,并在使用批处理执行时禁用自动提交。

JDBC 4.1,第14.1.1节说:

当发生错误并且auto-commit为true时, executeBatch的提交行为始终是实现定义的。

这只说明了错误条件的行为,但其含义是当批处理中的另一个语句抛出exception时,可能已经提交了单个语句。

从oracle文档 :

创建连接时,它处于自动提交模式。 这意味着每个单独的SQL语句都被视为一个事务,并在执行后立即自动提交。 (更确切地说,默认情况下,SQL语句在完成时提交,而不是在执行时提交。语句在检索到所有结果集和更新计数时完成。几乎在所有情况下, ,声明在执行后立即完成并因此被提交。)

所以你会在每次查询后得到提交。

每个查询都会提交,因为单个提交会在executeBatch()之后关闭自动提交和提交

 con.setAutoCommit(false); Statement stmt = con.createStatement(); stmt.addBatch(query);//add all the queries stmt.executeBatch(); con.commit();