3

我有这样的情况:

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

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

注意:数据库是Oracle 11

4

3 回答 3

8

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

JDBC 4.1,第 14.1.1 节说:

executeBatch当发生错误并且自动提交为真时,提交行为始终是实现定义的。

这仅说明了错误条件的行为,但暗示当批处理中的另一个语句引发异常时,单个语句可能已经提交。

于 2013-10-23T09:07:53.580 回答
5

来自oracle 文档

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

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

于 2013-10-23T08:30:07.433 回答
2

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

con.setAutoCommit(false);
Statement stmt = con.createStatement();
stmt.addBatch(query);//add all the queries
stmt.executeBatch();
con.commit();
于 2013-10-23T08:44:16.483 回答