我注意到一些程序员使用COMMIT
,其他人使用conn.setAutoCommit(true);
来结束事务或回滚,那么使用其中一个的好处是什么,与另一个有何不同?
它们之间的主要区别在哪里?
conn.setAutoCommit(true);
超过
statement.executeQuery(query);
statement.commit();
我注意到一些程序员使用COMMIT
,其他人使用conn.setAutoCommit(true);
来结束事务或回滚,那么使用其中一个的好处是什么,与另一个有何不同?
它们之间的主要区别在哪里?
conn.setAutoCommit(true);
超过
statement.executeQuery(query);
statement.commit();
Connection.commit()
而不是Connection.setAutoCommit(true)
来提交事务,除非您要从使用事务切换到“每个语句的事务”模型的自动提交。Connection.setAutoCommit(true)
将提交事务(如果驱动程序符合JDBC 4.1规范的第10.1.1节)。但是,您只有在打算在那之后保持自动提交时才应该这样做,因为启用/禁用连接上的自动提交可能会比简单地提交更耗费连接资源(例如,因为它需要在事务管理器之间进行切换、进行额外的检查等)。Connection.commit()
而不是使用本机SQL命令COMMIT
。正如Connection文档中所述:commit()
和setAutoCommit(boolean)
这样的命令可能会在后台执行更多的工作,例如关闭ResultSets
和关闭或重置Statements
。使用SQL命令COMMIT
将绕过此操作,并潜在地使您的驱动程序/连接进入不正确的状态。COMMIT
。 - Mark Rotteveelconn.setAutoCommit(true)
和 conn.commit(); conn.setAutoCommit(true);
是相同的,对吗? - rogerdpacksetAutoCommit(boolean)
的javadoc:_"如果在事务期间调用此方法并更改了自动提交模式,则会提交事务。"_ - Mark Rotteveelconn.setAutoCommit();
方法用于控制连接,您可以在一个事务中执行 X 个查询,或者每个 execute
使用一个单独的事务。
正如 API 描述的那样:
void setAutoCommit(boolean autoCommit)
throws SQLException
conn.setAutoCommit(false);
statement.executeQuery(query);
statement.commit();
将会与以下内容相同:
conn.setAutoCommit(true);
statement.executeQuery(query);
conn.setAutoCommit(true); statement.executeQuery(query);
将会和 conn.setAutoCommit(false); statement.executeQuery(query); statement.commit();
做相同的事情。请检查你的 statement.commit()
是否被成功调用,且没有返回任何 SQLException
。 - MrJames