Что происходит с транзакцией при возникновении ошибки?

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

Ответ

При ошибке в транзакции происходит откат (rollback) всех изменений, сделанных в её рамках. Это обеспечивает атомарность (Atomicity) — одно из свойств ACID.

Почему это важно: Откат гарантирует целостность данных — либо выполняются все операции транзакции, либо ни одна.

Пример на JDBC:

Connection conn = dataSource.getConnection();
try {
    conn.setAutoCommit(false);
    // Операции внутри транзакции
    stmt.executeUpdate("UPDATE accounts SET balance = balance - 100 WHERE id = 1");
    stmt.executeUpdate("UPDATE accounts SET balance = balance + 100 WHERE id = 2");
    conn.commit(); // Фиксация изменений
} catch (SQLException e) {
    conn.rollback(); // Автоматический откат при ошибке
} finally {
    conn.setAutoCommit(true);
    conn.close();
}

В Spring с @Transactional:

  • Для unchecked исключений (RuntimeException и его наследников) откат происходит автоматически.
  • Для checked исключений (Exception) нужно явно указать атрибут:
    @Transactional(rollbackFor = Exception.class)