Что такое пессимистическая блокировка (Pessimistic Locking) в базах данных?

«Что такое пессимистическая блокировка (Pessimistic Locking) в базах данных?» — вопрос из категории Базы данных, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Пессимистическая блокировка (Pessimistic Locking) — это стратегия управления конкурентным доступом, при которой СУБД заранее блокирует строку или таблицу для изменения, предполагая высокую вероятность конфликта. Другие транзакции, пытающиеся получить доступ к тем же данным, вынуждены ждать снятия блокировки.

Ключевые особенности:

  • Принцип: "Лучше заблокировать, чем потом разрешать конфликт".
  • Использование: Критичные операции, где целостность данных важнее производительности (например, финансовые транзакции, списание остатков).
  • Риски: Может приводить к взаимоблокировкам (deadlocks) и снижению параллелизма.

Пример реализации в SQL (MySQL/PostgreSQL):

-- Транзакция 1 блокирует строку для изменения
BEGIN TRANSACTION;
SELECT * FROM accounts WHERE id = 123 FOR UPDATE; -- Ключевая конструкция FOR UPDATE
-- Выполняем операции с данными...
UPDATE accounts SET balance = balance - 100 WHERE id = 123;
COMMIT; -- Блокировка снимается

-- Транзакция 2 будет ждать завершения Транзакции 1
BEGIN TRANSACTION;
SELECT * FROM accounts WHERE id = 123 FOR UPDATE; -- Этот запрос "зависнет" в ожидании

На практике я использовал пессимистические блокировки в системах бронирования и биллинга, где два пользователя не должны были одновременно купить последний билет или списать деньги с одного счета.