Ответ
Блокировки — это механизм СУБД, который предотвращает конфликтующие операции (одновременную запись в одни данные) параллельными транзакциями, обеспечивая согласованность. Основные типы в InnoDB (MySQL):
- Разделяемая блокировка (Shared Lock, S): Разрешает другим транзакциям читать данные, но запрещает устанавливать эксклюзивные блокировки на них. Используется для
SELECT ... LOCK IN SHARE MODE. - Эксклюзивная блокировка (Exclusive Lock, X): Запрещает другим транзакциям как читать (с блокировкой), так и изменять данные. Используется для операций
UPDATE,DELETEиSELECT ... FOR UPDATE.
Пример проблемы, которую решают блокировки (состояние гонки):
- Транзакция A читает баланс (100$).
- Транзакция B тоже читает баланс (100$).
- A и B одновременно рассчитывают новый баланс (+10$).
- A записывает 110$.
- 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) и серьезному падению производительности. Всегда старайтесь захватывать блокировки в одинаковом порядке и держать транзакции короткими.