TGViewer
Spring АйО Spring АйО @spring_aio · 10.9K subscribers
Post #630 4.89K
🛑 Использование сессии без транзакции — не повторяйте это дома!

На протяжении многих лет мы сталкивались с удивительно большим количеством людей, которые настаивают на том, что им нужно обращаться к базе данных «без транзакции» — под этим мы понимаем выполнение запросов с 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
  • 👍 13
  • ❤ 6
  • 🔥 4
  • 👌 1
More from @spring_aio
  1. Oct 8, 2026🍃 Spring Boot ломает совместимость, G1 тормозит микросервисы, Java долго релизит фичи | S…
  2. Oct 6, 2026👩‍💻 Spring Config Import без магии У наших друзей из Axelix вышла статья о том, как Spri…
  3. Oct 5, 2026🥲 В Java 27 TLS научился переживать квантовую атаку При установке HTTPS-соединения клиент…
  4. Oct 3, 2026⚡️⚡️Строки кода стремятся подешеветь до цены токена. Что остается ценным? Про это — трек «…
  5. Oct 2, 2026🙅‍♂️ Не каждый AI-вызов должен генерировать текст Иногда от модели нужен не красивый отве…
  6. Oct 1, 2026JEP 544: JVM будет сохранять машинный код между запусками JEP 544 (Ahead-of-Time Code Comp…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →