где мы должны использовать commit (session), в try или finally?

1

Если я хочу использовать фиксацию (сеанс) после успешного выполнения операции с базой данных, где ее лучше положить в try или в finally block? Здесь я использовал его, в конце концов, должен ли он попробовать?

public void delete( --- ) {
    Session session = init();
    try {
        ----
    } catch (HibernateException e) {
        rollback(session);
        logger.error("delete failed", e);
        throw e;
    } finally {
        commit(session);
        close(session);
    }
}
Теги:
hibernate
exception
try-catch

4 ответа

5
Лучший ответ

Это должно быть в try, по двум причинам:

  • Вы commit сеанс, если какое-либо исключение или ошибка, кроме исключения HibernateException, и вы почти наверняка не хотите этого делать
  • Вы вызовете commit после вызова rollback. Я не могу вспомнить, позволяет ли Hibernate сделать это (молча игнорируя откат), но, по крайней мере, это уродливо. Каждая сессия должна быть зафиксирована или отменена.

Нормальное решение здесь, чтобы сохранить отдельную boolean переменную, которая устанавливается, когда вы успешно совершить, и убедитесь, что в finally, откат в случае необходимости:

boolean committed = false;
try {
    // Do stuff
    commit(session);
    committed = true;
} catch (HibernateException e) {
    logger.error("delete failed", e);
    throw e;
} finally {
    if (!committed) {
        rollback(session);
    }
    // TODO: This won't execute if rollback fails.
    // Check whether that a problem.
    close(session);
}
  • 0
    Спасибо за подробный ответ, Джон.
  • 0
    Я думаю, что вы должны переместить откат внутри блока catch (без флага фиксации) вместо использования причины флага фиксации, если в результате фиксации произошла исключительная ситуация.
Показать ещё 3 комментария
0

Это должно быть в try. finally будет также вызван после catch.

0

Он должен определенно быть помещен в блок try. Окончательный блок используется только для закрытия любого соединения.

  • 0
    Что ж, блок finally также следует использовать для отката в этом случае, IMO, если сеанс не был зафиксирован. В противном случае любые необработанные исключения приведут к утечке этих сеансов.
0

вам нужно поместить его в блок try, иначе вы не узнаете никаких ошибок, и вы не сможете откатить

Ещё вопросы

Сообщество Overcoder
Наверх
Меню