Gymterview
middle

Какие уровни isolation существуют?

Isolation определяет, насколько транзакция изолирована от изменений, вносимых другими параллельными транзакциями.

Проблемы параллельного доступа

Проблема Описание
Dirty Read Чтение данных, которые ещё не зафиксированы другой транзакцией
Non-Repeatable Read Повторное чтение тех же данных даёт другой результат
Phantom Read Повторный запрос возвращает другое количество строк

Уровни изоляции

Isolation Dirty Read Non-Repeatable Read Phantom Read
READ_UNCOMMITTED Возможно Возможно Возможно
READ_COMMITTED Нет Возможно Возможно
REPEATABLE_READ Нет Нет Возможно
SERIALIZABLE Нет Нет Нет
DEFAULT Зависит от БД
Пример
@Transactional(isolation = Isolation.READ_COMMITTED)
public void updateBalance(Long accountId, BigDecimal amount) { }

@Transactional(isolation = Isolation.REPEATABLE_READ)
public void transfer(Long fromId, Long toId, BigDecimal amount) { }

На собеседовании: важно знать проблемы параллельного доступа и какой уровень от чего защищает. Для большинства приложений подходит READ_COMMITTED (PostgreSQL по умолчанию). Частая ошибка – использовать SERIALIZABLE повсеместно «для надёжности», что сильно снижает производительность.