Вопрос

Выполняет ли 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 в середине транзакции приводит к откату транзакции .

метод закрытия (SQLServerConnection)

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top