COMMIT或conn.setAutoCommit(true)

Mot*_*sem 10 java mysql jdbc percona

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

主要区别在哪里?

conn.setAutoCommit(true);
Run Code Online (Sandbox Code Playgroud)

过度

statement.executeQuery(query);
statement.commit();
Run Code Online (Sandbox Code Playgroud)

Mar*_*eel 11

您通常应该使用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将绕过此命令并可能使您的驱动程序/连接进入错误状态.


MrJ*_*mes 5

适用于连接的用法conn.setAutoCommit();使您可以在单个事务中执行 X 个查询,或者每个事务使用一个事务execute

正如 API 描述的那样:

 void setAutoCommit(boolean autoCommit)
                    throws SQLException
Run Code Online (Sandbox Code Playgroud)

将此连接的自动提交模式设置为给定状态。如果连接处于自动提交模式,则其所有 SQL 语句将作为单独的事务执行和提交。否则,它的 SQL 语句将被分组为事务,这些事务通过调用方法 commit 或方法 rollback 来终止。默认情况下,新连接处于自动提交模式

对于一个简单的情况:

conn.setAutoCommit(false); 
statement.executeQuery(query); 
statement.commit();
Run Code Online (Sandbox Code Playgroud)

将与以下内容相同:

conn.setAutoCommit(true); 
statement.executeQuery(query);
Run Code Online (Sandbox Code Playgroud)