Есть ли 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();
}

6 ответов

Решение

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

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

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

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

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

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

оракул

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

SQL Server

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

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

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

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

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