Есть ли Java Connection.close откат? - PullRequest
14 голосов
/ 20 октября 2008

Имеет ли 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 ]

24 голосов
/ 20 октября 2008

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

9 голосов
/ 21 октября 2008

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

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

    conn.commit();
} finally {
   conn.rollback();
   conn.close();
}
6 голосов
/ 20 октября 2008

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

5 голосов
/ 28 февраля 2013

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

Oracle

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

SQL Server

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

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

0 голосов
/ 02 августа 2014

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

0 голосов
/ 08 февраля 2013

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

...