我注意到有些程序员使用COMMIT
其他使用conn.setAutoCommit(true);
来结束交易或回滚,那么使用one而不是其他的有什么好处呢?
主要区别在哪里?
conn.setAutoCommit(true);
在
statement.executeQuery(query);
statement.commit();
答案 0 :(得分:11)
除非您想从使用事务切换到autoCommit的'每个语句的事务'模型,否则您通常应使用Connection.commit()
而不是Connection.setAutoCommit(true)
来提交事务。
也就是说,在事务中调用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
将绕过此命令,并可能使您的驱动程序/连接处于错误状态。
答案 1 :(得分: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);