Ответ
Без явного управления транзакциями каждый 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и др.) определяют, как видны параллельные изменения другим транзакциям.