# Блокировки и взаимоблокировки.

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