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 повсеместно «для надёжности», что сильно снижает производительность.