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

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

Ответ

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

Принцип работы:

  1. Когда транзакция собирается изменить данные (INSERT, UPDATE, DELETE), она запрашивает блокировку записи на соответствующую строку, страницу или таблицу.
  2. Эксклюзивность: Если блокировка получена, никакая другая транзакция не может установить на этот же ресурс ни блокировку записи, ни блокировку чтения (в большинстве уровней изоляции).
  3. Блокировка удерживается до конца транзакции (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, где "читатели не блокируют писателей, а писатели не блокируют читателей" для моментальных снимков данных.