Я искал разницу между getConnection().commit()
(1) и getConnection().setAutoCommit(true)
(2).Но в большинстве случаев просто опишите, что (1) является методом по умолчанию и редко его используете вместо (2), или оба метода имеют «разные цели» и один и тот же результат.Я использую пример на Oracle docs (https://docs.oracle.com/javase/tutorial/jdbc/basics/transactions.html#commit_transactions):
public void updateCoffeeSales(HashMap<String, Integer> salesForWeek)
throws SQLException {
PreparedStatement updateSales = null;
PreparedStatement updateTotal = null;
String updateString =
"update " + dbName + ".COFFEES " +
"set SALES = ? where COF_NAME = ?";
String updateStatement =
"update " + dbName + ".COFFEES " +
"set TOTAL = TOTAL + ? " +
"where COF_NAME = ?";
try {
con.setAutoCommit(false);
updateSales = con.prepareStatement(updateString);
updateTotal = con.prepareStatement(updateStatement);
for (Map.Entry<String, Integer> e : salesForWeek.entrySet()) {
updateSales.setInt(1, e.getValue().intValue());
updateSales.setString(2, e.getKey());
updateSales.executeUpdate();
updateTotal.setInt(1, e.getValue().intValue());
updateTotal.setString(2, e.getKey());
updateTotal.executeUpdate();
con.commit();
}
}
catch (SQLException e ) {
JDBCTutorialUtilities.printSQLException(e);
if (con != null) {
try {
System.err.print("Transaction is being rolled back");
con.rollback();
} catch(SQLException excep) {
JDBCTutorialUtilities.printSQLException(excep);
}
}
}
finally {
if (updateSales != null) {
updateSales.close();
}
if (updateTotal != null) {
updateTotal.close();
}
con.setAutoCommit(true);
}
}
}
. В этом примере я не знаю назначение con.setAutoCommit(true)
(1) в блоке finally
, потому что каждая задача уже была зафиксирована изtry
блок, хотя это может произойти исключение или нет. Может кто-нибудь дать мне четкое объяснение, когда должен использовать (1)? Большое спасибо за помощь.
Если метод по умолчанию true
, поэтому япросто сделать commit()
вместо (1) для завершения блока транзакции, и следующий метод блока (не нужно управлять транзакцией для этого блока) перейдет в режим по умолчанию (1), и мне не нужноснова установить его в true?
У меня есть гипотеза, что con.commit()
это просто фиксация оператора, и он все еще блокирует некоторую строку / таблицу до того, как (1) будет вызван снова. Я думаю, что я неправильно понимаю commit()
автоматически установит текущее значение по умолчанию на true
вместо попытки вызова (1) снова, потому что я протестировал некоторый код, после вызова commit()
все блокировки из строки / таблицы будут сняты все, поэтому моя гипотезаwronг тоже.