Ответ
Изоляция (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) {
// Логика перевода, защищенная от неповторяющихся чтений
}