Hibernate Session.close() автоматически откатывает незафиксированные транзакции?
В настоящее время я читаю документацию Hibernate, и я наткнулся на следующую цитату:
Если сеанс вызывает исключение, включая любое SQLException, немедленно откат транзакции базы данных, вызовите Session.close() и отмените экземпляр сеанса. Некоторые методы сеанса не оставляют сеанс в согласованном состоянии. Никакое исключение, вызванное Hibernate, не может рассматриваться как подлежащее восстановлению. Убедитесь, что сессия будет закрыта вызовом функции close() в блоке finally.
Все это имеет смысл, насколько мне известно, но меня заставляет задуматься, что эффект закрытия сеанса происходит с транзакцией, которая не была зафиксирована и не откатна?
Например, рассмотрим следующее:
session = getSessionFactory().openSession();
session.beginTransaction();
session.save(carObject);
//session.getTransaction().commit();
session.close();
С фиксацией комментирования и отсутствием отката здесь, каково ожидаемое поведение session.close()? Это просто откат, который совершает автоматически, оставляет ли он "вешающую" транзакцию? и др.
(Я понимаю, что это, очевидно, не было бы хорошей практикой - я просто пытаюсь немного осветить основные концепции).
Ответы
Ответ 1
Я немного перебрался в Hibernate:
Сплошные сеансы сохраняют свой жизненный цикл несколько независимым от JDBC-соединений. Когда вы закрываете Hibernate Session
, соединение будет отпущено. Точное значение "освобождения соединения" зависит от того, как было получено соединение :
- Если соединение было предоставлено вручную (например, через
sessionFactory.openStatelessSession(connection)
), вы получите свое соединение с возможной незавершенной транзакцией при вызове session.close()
- в других случаях вызов
session.close()
обычно заканчивается вызовом connection.close()
Автоматическая очистка сеанса или фиксация транзакции/откат не производится с помощью Hibernate. Те же самые состояния для JPA EntityManager
.
Итак, что происходит в конце, зависит от вашего провайдера/источника данных. С C3PO любая незавершенная транзакция будет отменена, когда соединение будет возвращено в пул. С другой стороны, если вы управляете соединением JTA, то фактическая обработка транзакций может быть полностью недоступна вашему приложению.