Ответ 1
В соответствии с javadoc, вы должны попытаться либо выполнить транзакцию, либо выполнить откат до вызова метода close. Результаты в противном случае определяются реализацией.
Перезапускается ли 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();
}
В соответствии с javadoc, вы должны попытаться либо выполнить транзакцию, либо выполнить откат до вызова метода close. Результаты в противном случае определяются реализацией.
В любой системе баз данных, с которой я работал, нет вреда при выполнении отката сразу после фиксации, поэтому, если вы зафиксируете в блоке try и откат в конечном итоге, все будет зафиксировано, тогда как если исключение или раннее возвращение заставляет коммит быть пропущен, откат откатит транзакцию. Таким образом, безопасная вещь -
try {
conn.setAutoCommit(false);
ResultSet rs = executeQuery(conn, ...);
....
executeNonQuery(conn, ...);
....
conn.commit();
} finally {
conn.rollback();
conn.close();
}
Драйвер Oracle JDBC по умолчанию закрывает(). Нельзя полагаться на это поведение, если вы намереваетесь написать многоплатформенный код JDBC.
Поведение полностью отличается от разных баз данных. Примеры:
Сделка совершается при закрытии соединения с открытой транзакцией (как указано @Mr. Shiny и New 安 宇.
Вызов метода close в середине транзакции вызывает транзакция, подлежащая откату.
Бесполезно откатываться, наконец, в блок. После того, как вы зафиксируете и совершите успешное выполнение, зачем откатываться? Так что, если бы я был вами, я бы откатился в catch catch.
Для MySQL JDBC реализация откатывает соединение, если оно закрыто без вызова методов фиксации или отката.