connection.setAutoCommit = false会发生什么

时间:2015-09-23 12:31:47

标签: java jdbc connection autocommit

如果我connection.setAutoCommit(false);会在数据库端创建新事务会怎么样?

4 个答案:

答案 0 :(得分:5)

根据documentationconnection.setAutoCommit(false)将允许您在同一交易下分组多个后续Statement。调用connection.commit()时将提交此事务,而不是在每个execute()调用单个Statement之后(如果启用了自动提交,则会发生这种情况)。

通过connection.setAutoCommit()更改自动提交模式将隐式提交活动事务并创建一个新事务。来自Javadocs

  

注意:如果在事务期间调用此方法并且更改了自动提交模式,则提交事务。如果调用setAutoCommit并且未更改自动提交模式,则调用是无操作。

答案 1 :(得分:1)

JavaDocs在Using Transactions Section

中提供了对此用例的一个很好的解释
  

禁用自动提交模式

     

创建连接时,它处于自动提交模式。这意味着   将每个单独的SQL语句视为事务并且是   执行后立即自动提交。 (更多   精确,默认情况下是SQL语句提交时   完成,而不是在执行时。所有声明都完成了   已检索到其结果集和更新计数。几乎   但是,所有情况下,声明都已完成,因此已经提交,   它被执行后立即。)

     

允许将两个或多个语句分组为a的方法   transaction是禁用自动提交模式。这证明了   在以下代码中,con是活动连接:

     

con.setAutoCommit(false);

答案 2 :(得分:1)

让我用代码简单解释一下。我们申请时

  

Connection.setAutoCommit(假);

在我们的源代码中,它将禁用autocommit选项,默认情况下在数据库中启用。

所以,你必须致电

  

Connection.commit();

显式保持对数据库的任何更改的方法。

Class.forName(drivers);
Connection dbConnnection=DriverManager.getConnection(connectionURL,username,password);
dbConnection.setAutoCommit(false); //Disabling the Autocommit
Statement selectStatement = dbConnection.createStatement("Select Query");
ResultSet rs = selectStatement.execute();
while(rs.next()){
    Statement updateStatement = dbConnection.createStatement("update Query");
    //Apply some changes to update record
    statement.execute();
    dbConnection.commit();  //Mandatory to execute to persist changes into database
}

答案 3 :(得分:0)

JDBC API中每个方法的实现取决于每个驱动程序。 Oracle可能会做一些与MySql截然不同的事情。

但是,只有调用connection.setAutoCommit(false);才能创建交易。它只表示当您调用connection.commit();时,使用此连接创建的任何语句都将一起提交。

查看this Oracle教程。