Откат Java Connection.close в блок finally?
Я знаю, что .Net SqlConnection.close делает это.
С этим я мог бы делать блоки try / finally без улова ...
Пример:
try {
conn.setAutoCommit(false);
ResultSet rs = executeQuery(conn, ...);
....
executeNonQuery(conn, ...);
....
conn.commit();
} finally {
conn.close();
}




Согласно javadoc, вы должны попытаться либо зафиксировать, либо откатиться перед вызовом метода close. В противном случае результаты зависят от реализации.
Драйвер Oracle JDBC по умолчанию выполняет функцию close (). Вы не должны полагаться на это поведение, если собираетесь писать многоплатформенный код JDBC.
В любой системе баз данных, с которой я работал, нет ничего плохого в том, чтобы выполнить откат сразу после фиксации, поэтому, если вы фиксируете в блоке try и откатываете в конечном итоге, все фиксируется, тогда как если исключение или ранний возврат вызывают фиксация будет пропущена, откат откатит транзакцию. Так что безопаснее всего это сделать
try {
conn.setAutoCommit(false);
ResultSet rs = executeQuery(conn, ...);
....
executeNonQuery(conn, ...);
....
conn.commit();
} finally {
conn.rollback();
conn.close();
}
Откат в блоке finally бесполезен. После того, как вы зафиксировали, и фиксация прошла успешно, зачем откатываться? Так что на вашем месте я бы откатился в блоке catch.
Это не бесполезно. Если исключение возникает до commit (), но после успешного выполнения в текущей транзакции, вы, скорее всего, захотите откатить эту транзакцию перед выходом из блока с доступом к соединению.
Поведение совершенно разное для разных баз данных. Примеры:
Транзакция фиксируется при закрытии соединения с открытой транзакцией (как заявил @Mr. Shiny and New 安 宇.
Calling the close method in the middle of a transaction causes the transaction to be rolled back.
Для MySQL JDBC реализация откатывает соединение, если оно закрыто без вызова методов фиксации или отката.
SQL Server будет жаловаться на это, если я не ошибаюсь