EMZETT.
Войти

Оптимистичная и пессимистичная блокировка

Коротко: При пессимистичной блокировке данные блокируют перед изменением, при оптимистичной лишь при сохранении проверяют, не изменил ли кто-то что-то в промежутке.

Подробнее: Оба метода предотвращают «потерянные обновления», когда двое редактируют одну запись и второе сохранение затирает первое.

Подробности

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

См. также: транзакции и ACID