SQL Server поддерживает несколько уровней изоляции транзакций, которые определяют, как транзакции взаимодействуют с изменениями данных, сделанными другими транзакциями. Каждый уровень предлагает разный компромисс между согласованностью данных и производительностью.
1. READ UNCOMMITTED
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
- Описание: Самый низкий уровень изоляции
- Поведение:
- Разрешает "грязное чтение" (чтение незафиксированных изменений)
- Нет блокировок при чтении данных
- Возможны неповторяемые чтения и фантомы
- Использование: Когда важнее производительность, чем точность данных (агрегации, аналитика)
2. READ COMMITTED
SET TRANSACTION ISOLATION LEVEL READ COMMITTED; -- Уровень по умолчанию
- Описание: Уровень по умолчанию в SQL Server
- Поведение:
- Запрещает "грязное чтение"
- Использует shared locks при чтении (освобождаются сразу после чтения)
- Возможны неповторяемые чтения и фантомы
- Варианты:
- READ COMMITTED SNAPSHOT (версия на основе snapshot)
- READ COMMITTED с блокировками (классический)
3. REPEATABLE READ
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
- Описание: Гарантирует, что данные, прочитанные в транзакции, не изменятся
- Поведение:
- Запрещает "грязное чтение" и неповторяемые чтения
- Удерживает shared locks до конца транзакции
- Возможны фантомные чтения
- Использование: Когда важно, чтобы повторные чтения возвращали те же данные
4. SERIALIZABLE
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
- Описание: Самый строгий уровень изоляции
- Поведение:
- Запрещает все аномалии ("грязное" чтение, неповторяемые чтения, фантомы)
- Использует range locks для предотвращения вставок в диапазон
- Эквивалентен последовательному выполнению транзакций
- Использование: Критичные операции, где важна полная изоляция
5. SNAPSHOT
SET TRANSACTION ISOLATION LEVEL SNAPSHOT;
- Описание: Изоляция на основе управления версиями
- Поведение:
- Работает с "моментальным снимком" данных на начало транзакции
- Нет блокировок при чтении
- Запрещает "грязное" чтение
- Конфликты обнаруживаются при попытке изменения
- Требования: Должна быть включена опция ALLOW_SNAPSHOT_ISOLATION на уровне БД
6. READ COMMITTED SNAPSHOT
ALTER DATABASE MyDB SET READ_COMMITTED_SNAPSHOT ON;
- Описание: Модификация READ COMMITTED с использованием версий
- Поведение:
- Чтение видит только зафиксированные данные
- Нет блокировок при чтении
- Возможны неповторяемые чтения и фантомы
- Особенность: Изменяет поведение READ COMMITTED для всей БД
Сравнение уровней изоляции
Уровень изоляции | Грязное чтение | Неповторяемое чтение | Фантомы | Блокировки |
READ UNCOMMITTED | Да | Да | Да | Нет |
READ COMMITTED | Нет | Да | Да | Кратковременные |
REPEATABLE READ | Нет | Нет | Да | До конца транзакции |
SERIALIZABLE | Нет | Нет | Нет | Range locks |
SNAPSHOT | Нет | Нет | Нет | Нет (версии) |
READ COMMITTED SNAPSHOT | Нет | Да | Да | Нет (версии) |
Резюмируем: Выбор уровня изоляции транзакций в SQL Server - это баланс между согласованностью данных и производительностью. Понимание различий между уровнями помогает выбрать оптимальный вариант для конкретного сценария работы с данными.