Что произойдет с транзакцией в JDBC, если первый UPDATE выполнится, а второй вызовет ошибку?

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

Ответ

Транзакция будет откатана (rollback) полностью. Это следует из принципа атомарности (ACID): транзакция либо фиксируется вся, либо не фиксируется вовсе.

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

try (Connection conn = dataSource.getConnection()) {
    conn.setAutoCommit(false); // 1. Начало транзакции

    // 2. Первый успешный UPDATE
    try (PreparedStatement stmt1 = conn.prepareStatement(
            "UPDATE accounts SET balance = balance - 100 WHERE id = 1")) {
        stmt1.executeUpdate();
    }

    // 3. Второй UPDATE вызывает ошибку (например, нарушение ограничения)
    try (PreparedStatement stmt2 = conn.prepareStatement(
            "UPDATE accounts SET balance = balance + 100 WHERE id = 999")) {
        stmt2.executeUpdate(); // Может выбросить SQLException
    }

    conn.commit(); // 4. Эта строка не будет достигнута из-за исключения
} catch (SQLException e) {
    // 5. При возникновении исключения происходит автоматический rollback.
    // Изменения из первого UPDATE НЕ будут сохранены в БД.
}

Ключевые моменты:

  • При выбросе SQLException до вызова commit() JDBC автоматически выполняет откат.
  • Если autoCommit = true, каждый statement — отдельная транзакция, и первый UPDATE уже будет зафиксирован.
  • Для управления вручную используйте conn.rollback() в блоке catch.