Оптимистичная и пессимистичная блокировка
Коротко: При пессимистичной блокировке данные блокируют перед изменением, при оптимистичной лишь при сохранении проверяют, не изменил ли кто-то что-то в промежутке.
Подробнее: Оба метода предотвращают «потерянные обновления», когда двое редактируют одну запись и второе сохранение затирает первое.
Подробности
- Пессимистичная:
SELECT ... FOR UPDATEблокирует строку до конца транзакции. Надёжно при высоком конфликте, но остальным приходится ждать, и грозят взаимоблокировки (deadlock). - Оптимистичная: У строки есть номер версии (или метка времени). При сохранении:
UPDATE ... SET ..., version = version + 1 WHERE id = ? AND version = ?. Если изменено 0 строк, кто-то другой сохранил, и нужно перезагрузить или слить. - Веб: Пользователь читает форму и сохраняет через минуты. Долгие блокировки непрактичны, поэтому обычна оптимистичная (ETag и
If-Matchв HTTP). - Выбор: Редкие конфликты → оптимистичная, частые конфликты на одних данных (остаток на складе, баланс счёта) → пессимистичная или атомарные обновления (
SET stock = stock - 1). - Контекст: См. MVCC и уровни изоляции.
См. также: транзакции и ACID