COMMIT或conn.setAutoCommit(true)

我注意到一些程序员使用COMMIT其他使用conn.setAutoCommit(true); 结束交易或回滚所以使用一个而不是另一个有什么好处?

主要区别在哪里?

 conn.setAutoCommit(true); 

过度

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

您通常应该使用Connection.commit()而不是Connection.setAutoCommit(true)来提交事务,除非您想要使用事务切换到autoCommit的’transaction per statement’模型。

也就是说,在事务中调用Connection.setAutoCommit(true)将提交事务(如果驱动程序符合JDBC 4.1规范的10.1.1节)。 但是你真的应该这样做,如果你的意思是留在autoCommit之后,因为在连接上启用/禁用autoCommit可能会比连接提交更多的连接开销(例如,因为它需要在事务管理器之间切换,做额外的检查等)。

您还应该使用Connection.commit()而不使用本机SQL命令COMMIT 。 详见连接文档:

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

问题是像commit()setAutoCommit(boolean)这样的命令可以在后台做更多工作,比如关闭ResultSets以及关闭或重置Statements 。 使用SQL命令COMMIT将绕过此命令并可能使您的驱动程序/连接进入错误状态。

conn.setAutoCommit();的用法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);