我有这样的情况:
con.setAutoCommit(true);
Statement stmt = con.createStatement();
stmt.addBatch(query);//add all the queries
stmt.executeBatch();
每个查询是单独提交还是整个批处理都会有一次提交?
注意:数据库是Oracle 11
答案 0 :(得分:7)
根据JDBC规范,启用自动提交的批处理执行的确切行为是实现定义的。所以这取决于数据库及其驱动程序,最好不要对确切的行为做出假设,并在使用批处理执行时禁用自动提交。
JDBC 4.1,第14.1.1节说:
当发生错误并且自动提交为真时,
executeBatch
的提交行为始终是实现定义的。
这只说明了错误条件的行为,但暗示当批处理中的另一个语句抛出异常时,可能已经提交了单个语句。
答案 1 :(得分:5)
创建连接时,它处于自动提交模式。 这意味着每个单独的SQL语句都被视为一个事务,并在执行后立即自动提交。(更确切地说,默认情况下,SQL语句在完成时提交,当它被执行时,语句就完成了。语句在检索完所有结果集和更新计数后就完成了。但是,几乎在所有情况下,语句都在完成后立即完成,因此被提交。)
所以你会在每次查询后得到提交。
答案 2 :(得分:2)
每个查询都会提交,因为单个提交会在executeBatch()
之后关闭自动提交和提交con.setAutoCommit(false);
Statement stmt = con.createStatement();
stmt.addBatch(query);//add all the queries
stmt.executeBatch();
con.commit();