Что такое блокировки в транзакциях баз данных?

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

Ответ

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

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

Пример проблемы, которую решают блокировки (состояние гонки):

  1. Транзакция A читает баланс (100$).
  2. Транзакция B тоже читает баланс (100$).
  3. A и B одновременно рассчитывают новый баланс (+10$).
  4. A записывает 110$.
  5. B записывает 110$ (потеряно изменение A).

Решение с SELECT ... FOR UPDATE:

-- Транзакция 1
START TRANSACTION;
SELECT balance FROM accounts WHERE id = 1 FOR UPDATE; -- X-блокировка на строку id=1
-- ... вычисления ...
UPDATE accounts SET balance = 110 WHERE id = 1;
COMMIT;

-- Транзакция 2 будет ждать разблокировки строки id=1, прежде чем выполнить свой SELECT FOR UPDATE.

Важные последствия: Неправильное использование блокировок (слишком долгие транзакции, блокировка больших диапазонов) может привести к взаимоблокировкам (deadlock) и серьезному падению производительности. Всегда старайтесь захватывать блокировки в одинаковом порядке и держать транзакции короткими.