Может ли в рамках одного подключения к БД (сессии) быть несколько транзакций?

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

Ответ

Да, может. В одной сессии (подключении) можно последовательно выполнить множество транзакций. Ключевое правило: в один момент времени активна только одна транзакция.

Типичный сценарий в JDBC:

Connection conn = dataSource.getConnection();
conn.setAutoCommit(false); // Отключаем автокоммит для ручного управления

try {
    // Транзакция 1
    PreparedStatement stmt1 = conn.prepareStatement("UPDATE accounts SET balance = ? WHERE id = ?");
    // ... операции
    conn.commit(); // Фиксация транзакции 1

    // Транзакция 2 начинается автоматически после commit/rollback
    PreparedStatement stmt2 = conn.prepareStatement("INSERT INTO log (message) VALUES (?)");
    // ... операции
    conn.commit(); // Фиксация транзакции 2

} catch (SQLException e) {
    conn.rollback(); // Откат текущей (активной) транзакции при ошибке
} finally {
    conn.close();
}

Пояснение:

  • После commit() или rollback() текущая транзакция завершается.
  • Следующая SQL-команда (например, INSERT, UPDATE) автоматически начинает новую транзакцию.
  • При autoCommit = true каждая отдельная команда выполняется в своей короткой транзакции, которая коммитится сразу.