Ответ
Блокировка записи (Write Lock, эксклюзивная блокировка) — это механизм управления параллельным доступом в СУБД, который гарантирует, что только одна транзакция может изменять данные в определенный момент времени.
Принцип работы:
- Когда транзакция собирается изменить данные (INSERT, UPDATE, DELETE), она запрашивает блокировку записи на соответствующую строку, страницу или таблицу.
- Эксклюзивность: Если блокировка получена, никакая другая транзакция не может установить на этот же ресурс ни блокировку записи, ни блокировку чтения (в большинстве уровней изоляции).
- Блокировка удерживается до конца транзакции (COMMIT или ROLLBACK).
Пример конфликта:
-- Транзакция 1 (получает блокировку записи на строку с id=1)
BEGIN;
UPDATE users SET balance = balance - 100 WHERE id = 1;
-- Транзакция 2 (будет ждать, пока Транзакция 1 не завершится)
BEGIN;
UPDATE users SET balance = balance + 50 WHERE id = 1; -- Ожидание...
Назначение и "почему":
- Сохранение целостности данных (ACID): Предотвращает "потерянные обновления" (Lost Update), когда две транзакции перезаписывают результаты друг друга.
- Обеспечение изоляции: Является основой для уровней изоляции
READ COMMITTED,REPEATABLE READиSERIALIZABLE. - Снижение производительности: Эксклюзивный характер блокировок записи — основная причина взаимоблокировок (deadlocks) и contention (соперничества) в высоконагруженных системах.
Современные альтернативы: Для снижения contention используются:
- Оптимистичные блокировки (версионирование,
WHERE version = ...). - MVCC (Multiversion Concurrency Control) в PostgreSQL, Oracle, где "читатели не блокируют писателей, а писатели не блокируют читателей" для моментальных снимков данных.