COMMIT或conn.setAutoCommit(true)

时间:2012-05-04 23:24:27

标签: java mysql jdbc percona

我注意到有些程序员使用COMMIT其他使用conn.setAutoCommit(true);来结束交易或回滚,那么使用one而不是其他的有什么好处呢?

主要区别在哪里?

conn.setAutoCommit(true);

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

2 个答案:

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