Что происходит при изменении данных в базе одним методом без управления транзакциями?

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

Ответ

Без явного управления транзакциями каждый SQL-запрос выполняется и фиксируется (COMMIT) автономно, сразу после успешного выполнения. Это может привести к несогласованности данных, если в середине метода произойдет ошибка: часть изменений уже будет сохранена, а последующие — нет.

Пример с транзакцией (Spring/Java):

@Transactional
public void updateOrder(Order order) {
    orderRepository.save(order);          // Изменение 1
    inventoryService.reduceStock(order);  // Изменение 2
    // Если здесь выбросится исключение,
    // оба изменения откатятся (ROLLBACK).
}

Пример без транзакции:

public void updateOrder(Order order) {
    orderRepository.save(order);          // Изменение 1 фиксируется сразу
    inventoryService.reduceStock(order);  // Изменение 2 выполняется отдельно
    // При ошибке здесь заказ уже изменен,
    // а stock остался прежним — нарушена целостность.
}

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

  • Автокоммит: По умолчанию многие драйверы/фреймворки используют режим автокоммита.
  • Атомарность: Транзакция (@Transactional, BEGIN/COMMIT) гарантирует, что все изменения внутри метода будут применены вместе или откатаны вместе.
  • Изоляция: Настройки изоляции транзакции (Isolation.READ_COMMITTED и др.) определяют, как видны параллельные изменения другим транзакциям.