Может ли одна сессия Hibernate (Session) содержать несколько транзакций?

«Может ли одна сессия Hibernate (Session) содержать несколько транзакций?» — вопрос из категории Базы данных, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, может. Объект Session в Hibernate можно использовать для выполнения нескольких последовательных транзакций. Однако управление их жизненным циклом должно быть явным и корректным.

Пример (Java):

Session session = sessionFactory.openSession();
try {
    // Транзакция 1
    Transaction tx1 = session.beginTransaction();
    session.save(new Entity("Data1"));
    tx1.commit();

    // Транзакция 2
    Transaction tx2 = session.beginTransaction();
    session.update(existingEntity);
    tx2.commit();
} catch (Exception e) {
    // Откат текущей транзакции при ошибке
    if (session.getTransaction().isActive()) {
        session.getTransaction().rollback();
    }
    throw e;
} finally {
    session.close(); // Важно закрывать сессию
}

Ключевые практики:

  • Явное управление: Каждую транзакцию (Transaction) нужно явно начать (beginTransaction) и завершить (commit или rollback).
  • Короткий срок жизни: Не держите транзакцию открытой долго. Идеальная модель — "одна бизнес-операция = одна транзакция".
  • Состояние сессии: После rollback объекты в сессии могут остаться в некорректном состоянии. Часто безопаснее откатить, закрыть сессию и начать новую.
  • Контекст транзакций: В Spring часто используется @Transactional, который автоматически управляет границами транзакций на уровне сервиса.