Ответ
Lock state (состояние блокировки) — это механизм управления параллельным доступом, при котором транзакция в базе данных временно получает эксклюзивные или разделяемые права на объект (строку, таблицу, страницу), чтобы предотвратить конфликты чтения и записи (race conditions) и обеспечить согласованность данных (ACID).
Основные типы блокировок:
- Эксклюзивная блокировка (Exclusive Lock, X): Запрещает другим транзакциям как читать, так и изменять заблокированные данные. Используется для операций
UPDATE,DELETE,INSERT. - Разделяемая блокировка (Shared Lock, S): Позволяет другим транзакциям читать данные, но запрещает их изменение. Используется для операции
SELECT.
Уровни блокировок (Granularity):
- Блокировка строки (Row-level): Наименьшая гранулярность, минимизирует конкуренцию. Используется в InnoDB (MySQL/PostgreSQL).
- Блокировка таблицы (Table-level): Блокирует всю таблицу. Менее эффективна для параллелизма, но проще в управлении. Используется в MyISAM.
- Блокировка страницы (Page-level): Блокирует группу строк (страницу).
Проблемы блокировок:
- Взаимная блокировка (Deadlock): Две или более транзакции ожидают освобождения ресурсов, заблокированных друг другом. СУБД автоматически обнаруживает deadlock и откатывает одну из транзакций.
- Блокировка (Blocking): Длительная транзакция удерживает блокировки, заставляя другие транзакции ждать.
Пример в PostgreSQL (явная блокировка):
BEGIN;
-- Получаем эксклюзивную блокировку строки
SELECT * FROM accounts WHERE id = 1 FOR UPDATE;
-- Выполняем обновление...
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
COMMIT;
Для DevOps-инженера понимание блокировок критично при анализе медленных запросов, расследовании инцидентов "зависшей" БД и настройке изоляции транзакций (READ COMMITTED, REPEATABLE READ) для баланса между согласованностью и производительностью.