如果我connection.setAutoCommit(false);
会在数据库端创建新事务会怎么样?
答案 0 :(得分:5)
根据documentation,connection.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教程。