Откат Java Connection.close?

Откат Java Connection.close в блок finally?

Я знаю, что .Net SqlConnection.close делает это.

С этим я мог бы делать блоки try / finally без улова ...

Пример:

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

    conn.commit();
} finally {
   conn.close();
}
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
16
0
19 208
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Ответ принят как подходящий

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

Драйвер Oracle JDBC по умолчанию выполняет функцию close (). Вы не должны полагаться на это поведение, если собираетесь писать многоплатформенный код JDBC.

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

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

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

SQL Server будет жаловаться на это, если я не ошибаюсь

a_horse_with_no_name 28.02.2013 16:21

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

Это не бесполезно. Если исключение возникает до commit (), но после успешного выполнения в текущей транзакции, вы, скорее всего, захотите откатить эту транзакцию перед выходом из блока с доступом к соединению.

Kirby 24.01.2014 23:49

Поведение совершенно разное для разных баз данных. Примеры:

Oracle

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

SQL Server

Calling the close method in the middle of a transaction causes the transaction to be rolled back.

close Метод (SQLServerConnection)

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

Другие вопросы по теме