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);