11

我注意到一些程序员使用COMMIT其他方法conn.setAutoCommit(true);来结束事务或回滚,那么使用一个而不是另一个有什么好处?

主要区别在哪里?

conn.setAutoCommit(true);

超过

statement.executeQuery(query);
statement.commit();
4

2 回答 2

12

一般情况下,您应该使用Connection.commit()而不是Connection.setAutoCommit(true)提交事务,除非您想从使用事务切换到 autoCommit 的“每个语句的事务”模型。

也就是说,Connection.setAutoCommit(true)在事务中调用将提交事务(如果驱动程序符合 JDBC 4.1 规范的第 10.1.1 节)。但是,如果您打算在那之后留在 autoCommit 中,您真的应该这样做,因为在连接上启用/禁用 autoCommit 可能比简单提交具有更高的连接开销(例如,因为它需要在事务管理器之间切换,请进行额外检查, ETC)。

您还应该使用Connection.commit()而不是使用本机 SQL 命令COMMIT。如连接文档中所述:

注意:配置 Connection 时,JDBC 应用程序应使用适当的 Connection 方法,例如 setAutoCommit 或 setTransactionIsolation。当有可用的 JDBC 方法时,应用程序不应直接调用 SQL 命令来更改连接的配置。

问题是命令喜欢commit()并且setAutoCommit(boolean)可能在后台做更多的工作,比如关闭ResultSets和关闭或重置Statements。使用 SQL 命令COMMIT将绕过这一点,并可能使您的驱动程序/连接进入不正确的状态。

于 2012-05-05T08:08:18.293 回答
4

的用法conn.setAutoCommit();适用于连接,使您可以在单个事务中执行 X 查询,或在每个事务中使用一个事务execute

正如 API 所描述的:

 void setAutoCommit(boolean autoCommit)
                    throws SQLException

将此连接的自动提交模式设置为给定状态。如果连接处于自动提交模式,则其所有 SQL 语句将作为单独的事务执行和提交。否则,它的 SQL 语句将被分组为通过调用方法提交或方法回滚终止的事务。默认情况下,新连接处于自动提交模式

对于一个简单的案例:

conn.setAutoCommit(false); 
statement.executeQuery(query); 
statement.commit();

将与以下内容相同:

conn.setAutoCommit(true); 
statement.executeQuery(query);
于 2012-05-04T23:31:14.790 回答