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

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