Получить доступ

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

MiddleТранзакции и изоляцияSQLHibernate / JPA
Ещё спрашивают так:
  • Как работает @Version в JPA?
  • Когда использовать SELECT FOR UPDATE?
Коротко

Пессимистическая — блокируем строку заранее (SELECT ... FOR UPDATE), остальные ждут. Оптимистическая — не блокируем, а при записи проверяем версию (WHERE version = ?); не совпала — конфликт, повторяем.

  • Частые конфликты и короткие транзакции — пессимистическая
  • Редкие конфликты и долгое «думание» (форма редактирования) — оптимистическая
  • В JPA: @Version и OptimisticLockException; @Lock(PESSIMISTIC_WRITE)

А ещё Для счётчиков лучше атомарный UPDATE ... SET x = x - 1 WHERE x > 0

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Попробуйте сами

Уровни изоляции: версии строк, снимки и аномалии

Подробно

Пессимистическая блокировка исходит из того, что конфликт вероятен: SELECT ... FOR UPDATE блокирует строки до конца транзакции, другие транзакции с FOR UPDATE ждут. Просто и надёжно, но блокировки держатся всё время транзакции, возможны дедлоки при захвате нескольких строк, и нельзя держать блокировку, пока пользователь думает. Варианты: NOWAIT (сразу ошибка), SKIP LOCKED (очереди задач в таблице).

Оптимистическая блокировка считает конфликты редкими. В строке есть колонка version; при обновлении: UPDATE ... SET ..., version = version + 1 WHERE id = ? AND version = ?. Если обновлено 0 строк — кто-то изменил раньше: перечитать и повторить или показать конфликт пользователю. Работает между HTTP-запросами (ETag и If-Match), не держит блокировок.

Выбор:

  • конфликты часты (горячая строка) — пессимистическая, иначе оптимистическая будет постоянно откатываться;
  • пользователь редактирует данные минутами — только оптимистическая;
  • простое изменение счётчика — ни та, ни другая: атомарный UPDATE.

Что хотят услышать

  • Механика обеих блокировок.
  • Критерий выбора: частота конфликтов и длительность.
  • Поддержка в JPA.
  • Атомарный UPDATE как альтернатива — плюс.

Частые ошибки

  • Держать FOR UPDATE во время внешних вызовов.
  • Не обрабатывать OptimisticLockException.

Что спросят дальше

  • Как реализуется @Version в JPA?
  • Как избежать deadlock при FOR UPDATE?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем