Откат Java Connection.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();
}

Ответы

Ответ 1

В соответствии с javadoc, вы должны попытаться либо выполнить транзакцию, либо выполнить откат до вызова метода close. Результаты в противном случае определяются реализацией.

Ответ 2

В любой системе баз данных, с которой я работал, нет вреда при выполнении отката сразу после фиксации, поэтому, если вы зафиксируете в блоке try и откат в конечном итоге, все будет зафиксировано, тогда как если исключение или раннее возвращение заставляет коммит быть пропущен, откат откатит транзакцию. Таким образом, безопасная вещь -

try {
    conn.setAutoCommit(false);
    ResultSet rs = executeQuery(conn, ...);
    ....
    executeNonQuery(conn, ...);
    ....

    conn.commit();
} finally {
   conn.rollback();
   conn.close();
}

Ответ 4

Поведение полностью отличается от разных баз данных. Примеры:

Oracle

Сделка совершается при закрытии соединения с открытой транзакцией (как указано @Mr. Shiny и New 安 宇.

SQL Server

Вызов метода close в середине транзакции вызывает транзакция, подлежащая откату.

закрыть Метод (SQLServerConnection)

Ответ 5

Бесполезно откатываться, наконец, в блок. После того, как вы зафиксируете и совершите успешное выполнение, зачем откатываться? Так что, если бы я был вами, я бы откатился в catch catch.

Ответ 6

Для MySQL JDBC реализация откатывает соединение, если оно закрыто без вызова методов фиксации или отката.