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

person Antonio    schedule 20.10.2008    source источник


Ответы (6)


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

person Joel    schedule 20.10.2008

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

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

    conn.commit();
} finally {
   conn.rollback();
   conn.close();
}
person Paul Tomblin    schedule 21.10.2008
comment
SQL Server будет жаловаться на это, если я не ошибаюсь - person a_horse_with_no_name; 28.02.2013

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

person Mr. Shiny and New 安宇    schedule 20.10.2008

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

Оракул

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

SQL-сервер

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

метод close (SQLServerConnection)

person lbergnehr    schedule 28.02.2013

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

person Adnan Memon    schedule 02.08.2014

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

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