Выполняет ли Java Connection.close откат?
-
03-07-2019 - |
Вопрос
Выполняет ли Java Connection.close откат в блок finally?.
Я знаю, что .Net SqlConnection.close делает это.
С помощью этого я мог бы создавать блоки try / finally без catch ...
Пример:
try {
conn.setAutoCommit(false);
ResultSet rs = executeQuery(conn, ...);
....
executeNonQuery(conn, ...);
....
conn.commit();
} finally {
conn.close();
}
Решение
Согласно джавадок, вы должны попытаться либо зафиксировать, либо выполнить откат перед вызовом метода close.В остальном результаты определяются реализацией.
Другие советы
В любой системе баз данных, с которой я работал, нет ничего плохого в выполнении отката сразу после фиксации, поэтому, если вы фиксируете в блоке try и выполняете откат в блоке finally, все фиксируется, тогда как если исключение или досрочный возврат приводят к пропуску фиксации, откат приведет к откату транзакции.Так что самое безопасное, что нужно сделать, это
try {
conn.setAutoCommit(false);
ResultSet rs = executeQuery(conn, ...);
....
executeNonQuery(conn, ...);
....
conn.commit();
} finally {
conn.rollback();
conn.close();
}
Драйвер JDBC Oracle фиксирует close() по умолчанию. Вам не следует полагаться на такое поведение, если вы собираетесь писать многоплатформенный код JDBC.
Поведение совершенно разное в разных базах данных.Примеры:
Oracle
Транзакция фиксируется при закрытии соединения с открытой транзакцией (как @Mr.Блестящий и Новый, как указано. 安宇
SQL Сервер
Вызов метода close в середине транзакции приводит к откату транзакции .
Откатывать в блоке finally бесполезно.После того, как вы зафиксировали и фиксация прошла успешно, зачем откатываться?Так что на вашем месте я бы откатил в блоке catch.
Для MySQL JDBC реализация откатывает соединение, если оно закрыто, без вызова методов commit или rollback.