🛑 Использование сессии без транзакции — не повторяйте это дома!На протяжении многих лет мы сталкивались с удивительно большим количеством людей, которые настаивают на том, что им нужно обращаться к базе данных «без транзакции» — под этим мы понимаем выполнение запросов с
autoСommit = true в рамках JDBC. Мы уверены, что это почти всегда ужасная идея, и что большинство людей, поступающих так, просто заблуждаются относительно аспектов изоляции транзакций или не понимают, что использование автокоммита означает для управления пулом JDBC-соединений.
Тем не менее Hibernate это, пусть неохотно, но позволяет.
Если вы всё же решитесь на этот странный шаг:
🛑для начала убедитесь, что вы полностью осознаёте: база данных не сможете помочь Вам обеспечить привычную изоляцию транзакций,
🛑затем установите
hibernate.connection.autocommit=true🛑и обязательно убедитесь, что ваш пул соединений возвращает соединения с включённым автокоммитом по умолчанию.
На самом деле,
просто не делайте этого, если только вы не настроили инструменты для анализа низкоуровневого взаимодействия между JDBC-драйвером и сервером базы данных, чтобы вы могли убедиться, что ваше понимание «без транзакции» соответствует действительности.
Если вы всё-таки хотите писать в базу данных с включённым автокомитом — это возможно, но вам придётся или вызвать
flush() на Session-е явным образом, или, ещё лучше, использовать
StatelessSession. И, пожалуйста, не жалуйтесь потом, что ваша база данных оказывается в неконсистентном состоянии.
🍃 Комментарий от экспертов Spring АйО:Автокомит, действительно, негативно сказывается на производительности приложения. Помимо этого, с его помощью можно получить неконсистентное состояние БД при обновлении (например, при попытке исполнить набор
UPDATE операций).
С другой стороны, если Вы используете Spring, то ваш
@Autowired EntityManager entityManager или
@PersistenceContext EntityManager entityManager, по-умолчанию, имеет lifecycle привязанный к жизни текущей транзакции Spring-а. То есть, Spring, по-умолчанию, требует от Вас декларировать транзакции в том или ином виде самостоятельно, чтобы Вы могли использовать
EntityManager, что, в целом, довольно правильно.
🔗
Ссылка на userguide: https://docs.jboss.org/hibernate/orm/5.3/userguide/html_single/Hibernate_User_Guide.html#configurations-database-connection