Skip to main content

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

Блокировка — запрет другим транзакциям доступа к объекту для предотвращения коллизий и обеспечения целостности данных.

По области действия

  • Строчная (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 секунд

Эскалация блокировок

Если слишком много мелких блокировок (строки), СУБД заменяет их на блокировку таблицы для экономии памяти.