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

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

Ответ

Отсутствие транзакционного управления приводит к нарушению ACID-свойств, что вызывает критические проблемы с целостностью данных.

Основные проблемы:

  1. Нарушение атомарности (Atomicity): Операция, состоящая из нескольких шагов, может выполниться частично.

    • Пример (перевод средств): Деньги списались со счета A, но не зачислились на счет B из-за ошибки после первого запроса. Данные становятся некорректными.
  2. Нарушение согласованности (Consistency): База данных переходит из одного целостного состояния в другое, минуя промежуточные целостные состояния.

    • Могут нарушаться бизнес-инварианты (например, «общая сумма на всех счетах должна оставаться постоянной»).
  3. Проблемы с изоляцией (Isolation): При параллельном выполнении операций возникают аномалии:

    • «Грязное» чтение (Dirty Read): Чтение незафиксированных данных другой транзакции, которые могут быть откатаны.
    • Неповторяющееся чтение (Non-repeatable Read): Два последовательных чтения одной строки в рамках одной транзакции возвращают разные данные из-за параллельного обновления.
    • Фантомное чтение (Phantom Read): Появление новых строк при повторном выполнении запроса с тем же условием.

Код-иллюстрация проблемы:

// ОПАСНО: Отсутствие транзакции
public void transferMoney(Long fromId, Long toId, BigDecimal amount) {
    // Шаг 1: Списание
    accountRepository.decreaseBalance(fromId, amount); // Успех
    // Если здесь случится исключение или сбой сервера...
    // Шаг 2: Зачисление
    accountRepository.increaseBalance(toId, amount); // Не выполнится
    // Результат: деньги «исчезли».
}

Решение: Использование декларативных (@Transactional) или программных транзакций, которые гарантируют откат (Rollback) всех изменений в случае ошибки.