Что такое изоляция (Isolation) в транзакциях?

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

Ответ

Изоляция (Isolation) — одно из свойств ACID-транзакций, которое определяет, как и когда изменения, сделанные одной транзакцией, становятся видимыми для других параллельно выполняющихся транзакций. Высокая изоляция снижает аномалии, но может негативно влиять на производительность.

Уровни изоляции в SQL (от низкого к высокому):

Уровень Грязное чтение Неповторяющееся чтение Фантомное чтение Описание
READ UNCOMMITTED ✅ Возможно ✅ Возможно ✅ Возможно Чтение незафиксированных данных других транзакций.
READ COMMITTED ❌ Запрещено ✅ Возможно ✅ Возможно Чтение только зафиксированных данных (стандарт в многих СУБД).
REPEATABLE READ ❌ Запрещено ❌ Запрещено ✅ Возможно Гарантирует, что строки, прочитанные дважды в одной транзакции, не изменятся.
SERIALIZABLE ❌ Запрещено ❌ Запрещено ❌ Запрещено Полная изоляция, транзакции выполняются так, как будто они идут последовательно.

Аномалии, которые предотвращают уровни изоляции:

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

Настройка в Spring (@Transactional):

import org.springframework.transaction.annotation.Isolation;

@Transactional(isolation = Isolation.REPEATABLE_READ)
public void transferMoney(Long fromId, Long toId, BigDecimal amount) {
    // Логика перевода, защищенная от неповторяющихся чтений
}