我注意到一些程序员使用COMMIT
其他方法conn.setAutoCommit(true);
来结束事务或回滚,那么使用一个而不是另一个有什么好处?
主要区别在哪里?
conn.setAutoCommit(true);
超过
statement.executeQuery(query);
statement.commit();
一般情况下,您应该使用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
将绕过这一点,并可能使您的驱动程序/连接进入不正确的状态。
的用法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);