Ответ
Уровни изоляции определяют, насколько транзакции изолированы друг от друга, балансируя между согласованностью данных и производительностью. Стандарт SQL определяет 4 уровня, от наименее к наиболее строгим.
Уровни изоляции и предотвращаемые аномалии:
| Уровень изоляции | Грязное чтение (Dirty Read) | Неповторяемое чтение (Non-repeatable Read) | Фантомное чтение (Phantom Read) |
|---|---|---|---|
| READ UNCOMMITTED | ❌ | ❌ | ❌ |
| READ COMMITTED | ✅ | ❌ | ❌ |
| REPEATABLE READ | ✅ | ✅ | ❌ |
| SERIALIZABLE | ✅ | ✅ | ✅ |
Описание уровней:
- READ UNCOMMITTED: Транзакция видит незафиксированные изменения других транзакций ("грязные" данные). Самый низкий уровень, может привести к несогласованности.
- READ COMMITTED: Гарантирует, что транзакция читает только зафиксированные данные. Это уровень по умолчанию в PostgreSQL, Oracle, SQL Server.
- REPEATABLE READ: Гарантирует, что если строка прочитана дважды в одной транзакции, ее значение не изменится. Однако могут появиться новые строки ("фантомы"). Уровень по умолчанию в MySQL InnoDB.
- SERIALIZABLE: Самый строгий уровень. Эмулирует последовательное выполнение транзакций, полностью предотвращая все аномалии. Часто использует блокировки, что снижает параллелизм.
Использование в Java (Spring):
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Transactional;
@Transactional(isolation = Isolation.READ_COMMITTED)
public void transferMoney(Long fromId, Long toId, BigDecimal amount) {
// Логика перевода
}
Важно: Фактическая реализация и поведение уровней изоляции могут отличаться в разных СУБД (например, в MySQL REPEATABLE READ предотвращает и фантомы). Всегда сверяйтесь с документацией вашей базы данных.