🤔 Что такое блокировки (локи) в БД?
Блокировки (локи) в базе данных - это механизмы, которые управляют доступом к данным, чтобы обеспечить их целостность и предотвратить конфликты при одновременном доступе нескольких транзакций.
🚩Основные типы
🟠Блокировки уровня таблицы (Table-Level Locks):
ACCESS SHARE: Позволяет чтение данных, блокирует команды, изменяющие таблицу.
ROW SHARE: Применяется для команд SELECT FOR UPDATE и SELECT FOR SHARE.
ROW EXCLUSIVE: Используется при вставке, обновлении или удалении строк.
SHARE UPDATE EXCLUSIVE: Используется для команд VACUUM.
SHARE: Обеспечивает видимость текущего состояния данных (ANALYZE).
SHARE ROW EXCLUSIVE: Используется для операций, требующих более строгого контроля (CREATE INDEX CONCURRENTLY).
EXCLUSIVE: Требуется для команд, изменяющих структуру таблицы (ALTER TABLE).
ACCESS EXCLUSIVE: Блокирует все команды, включая SELECT (DROP TABLE, ALTER TABLE).
🟠Блокировки уровня строки (Row-Level Locks):
SELECT FOR UPDATE: Блокирует строки для изменения.
SELECT FOR NO KEY UPDATE: Похоже на SELECT FOR UPDATE, но позволяет другим транзакциям выполнять SELECT FOR SHARE и SELECT FOR KEY SHARE.
SELECT FOR SHARE: Блокирует строки для чтения.
SELECT FOR KEY SHARE: Похоже на SELECT FOR SHARE, но позволяет другим транзакциям выполнять SELECT FOR NO KEY UPDATE и SELECT FOR UPDATE.
🟠Консультативные блокировки (Advisory Locks):
Устанавливаются вручную для синхронизации произвольных ресурсов.
pg_advisory_lock: Устанавливает консультативную блокировку.
pg_advisory_unlock: Снимает консультативную блокировку.
pg_try_advisory_lock: Пытается установить консультативную блокировку без ожидания.
🚩Основные цели
🟠Предотвращение гонок (race conditions):
Обеспечивают корректность данных при одновременном доступе нескольких транзакций.
🟠Изоляция транзакций:
Выполнение каждой транзакции в изолированном контексте.
🟠Защита целостности данных:
Предотвращение одновременного изменения данных, что может привести к их несогласованности.
🚩Примеры использования
🟠Интернет-магазин:
Блокировки могут предотвращать одновременное изменение состояния товара.
🟠Банковские операции:
При переводе средств используются блокировки для предотвращения одновременного списания или зачисления.
🟠Редактирование данных:
При одновременном редактировании одной записи несколькими пользователями.
🚩Проблемы, связанные с блокировками
🟠Дедлоки (Deadlocks):
Ситуация, когда транзакции блокируют друг друга, ожидая освобождения ресурсов.
🟠Гранулярность блокировок:
Блокировки высокой гранулярности могут снижать производительность.
Ставь 👍 и забирай 📚 Базу знаний
Post #1734
226