Что такое lock state (состояние блокировки) в контексте баз данных?

«Что такое lock state (состояние блокировки) в контексте баз данных?» — вопрос из категории Базы данных, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Lock state (состояние блокировки) — это механизм управления параллельным доступом, при котором транзакция в базе данных временно получает эксклюзивные или разделяемые права на объект (строку, таблицу, страницу), чтобы предотвратить конфликты чтения и записи (race conditions) и обеспечить согласованность данных (ACID).

Основные типы блокировок:

  • Эксклюзивная блокировка (Exclusive Lock, X): Запрещает другим транзакциям как читать, так и изменять заблокированные данные. Используется для операций UPDATE, DELETE, INSERT.
  • Разделяемая блокировка (Shared Lock, S): Позволяет другим транзакциям читать данные, но запрещает их изменение. Используется для операции SELECT.

Уровни блокировок (Granularity):

  1. Блокировка строки (Row-level): Наименьшая гранулярность, минимизирует конкуренцию. Используется в InnoDB (MySQL/PostgreSQL).
  2. Блокировка таблицы (Table-level): Блокирует всю таблицу. Менее эффективна для параллелизма, но проще в управлении. Используется в MyISAM.
  3. Блокировка страницы (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) для баланса между согласованностью и производительностью.