Блокировки и взаимоблокировки.
Блокировка — запрет другим транзакциям доступа к объекту для предотвращения коллизий и обеспечения целостности данных.
⸻
По области действия
- Строчная (Row-level) — блокируется только одна строка, остальные строки доступны.
- Гранулярная (Table/Page) — блокируется вся таблица или страница.
- Предикатная (Range/Predicate) — блокировка по диапазону значений, предотвращает фантомные чтения (Serializable).
⸻
По строгости
Intent Lock (Блокировка намерений)
⸻
По логике реализации
- Пессимистическая — блокировки до модификации, предотвращает конфликты заранее.
- Оптимистическая — проверка конфликта перед коммитом; откат при изменении данных другими транзакциями.
⸻
Двухфазные блокировки (2PL)
- Growing (Фаза захвата) — берутся блокировки.
- Shrinking (Фаза освобождения) — отпускаются блокировки.
Гарантирует сериализуемость транзакций.
⸻
Взаимоблокировки (Deadlock)
Условия:
- Mutual Exclusion — ресурс эксклюзивен
- Hold and Wait — держит ресурс и ждёт другой
- No Preemption — нельзя отобрать ресурс
- Circular Wait — замкнутый круг ожиданий
Решения:
- Обнаружение: строится граф ожиданий, откат одной транзакции при цикле
- Предотвращение: Wait-Die, Wound-Wait
- Игнорирование: таймаут N секунд
⸻
Эскалация блокировок
Если слишком много мелких блокировок (строки), СУБД заменяет их на блокировку таблицы для экономии памяти.
No comments to display
No comments to display