setAutoCommit(true)是否会提交过去的执行?

时间:2015-01-16 12:16:01

标签: java sql oracle swing jdbc

public void batchUpdate() throws SQLException {

Statement stmt = null;
try {
    this.connection.setAutoCommit(false);
    stmt = this.connection.createStatement();


    stmt.addBatch("INSERT INTO COFFEES VALUES('Amaretto_decaf', 49, 10.99, 0, 0)");

    stmt.addBatch("INSERT INTO COFFEES " +"VALUES('Hazelnut_decaf', 49, 10.99, 0, 0)");

    int [] updateCounts = stmt.executeBatch();
    this.connection.commit();

} catch(BatchUpdateException b) {
    JDBCTutorialUtilities.printBatchUpdateException(b);
} catch(SQLException ex) {
    JDBCTutorialUtilities.printSQLException(ex);
} finally {
    if (stmt != null) { stmt.close(); }
    this.connection.setAutoCommit(true);
}
}

的问题:

  1. 调用connection.setAutoCommit(true)会再次提交已经提交的语句(通过方法connection.commit())还是只恢复默认状态,而不必自己调用方法提交?

  2. 是否关闭了连接而没有调用connection.setAutoCommit(true)自动调用该方法,或者下次打开时它仍然是connection.setAutoCommit(false)

3 个答案:

答案 0 :(得分:2)

  1. 已提交的语句未再次提交。

  2. 这取决于您的连接源:在该状态下释放连接池时,连接池可能会为您提供autoCommit = false的连接,新的连接将以默认值打开。

      

    强烈建议应用程序在调用close方法之前显式提交或回滚活动事务。如果调用close方法并且存在活动事务,则结果是实现定义的。   http://docs.oracle.com/javase/7/docs/api/java/sql/Connection.html#close%28%29

答案 1 :(得分:1)

根据API

1)如果在事务期间调用了setAutocommit并且更改了自动提交模式,则提交事务。

2)如果调用close方法并且存在活动事务,则结果是实现定义的。

未定义其他行为

答案 2 :(得分:-2)

  1. click!
  2. 这是标准的。在没有提交时关闭它没有提交。