Есть ли 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 в середине транзакции вызывает откат транзакции.
Для MySQL JDBC реализация откатывает соединение, если оно закрыто, без вызова методов commit или rollback.
Откат в окончательном блоке бесполезен. После того, как вы зафиксировали, и фиксация прошла успешно, зачем откатываться назад? Так что, если бы я был тобой, я бы сделал откат в блоке catch.