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);
}
}
的问题:
调用connection.setAutoCommit(true)会再次提交已经提交的语句(通过方法connection.commit()
)还是只恢复默认状态,而不必自己调用方法提交?
是否关闭了连接而没有调用connection.setAutoCommit(true)
自动调用该方法,或者下次打开时它仍然是connection.setAutoCommit(false)
?
答案 0 :(得分: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)