Sobes.tech
Back to questions
Senior
5

Что такое оптимистичная и пессимистичная блокировки в JPA/Hibernate? Как устроены под капотом? В каких случаях что применять?

Companies where asked
Позитив Технолоджис

Answer from AI

sobes.tech AI

Оптимистичная блокировка и пессимистичная блокировка — два подхода к управлению конкурентным доступом к данным в JPA/Hibernate.


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

  • Основана на предположении, что конфликты редки.
  • При чтении данных блокировки не ставятся.
  • При сохранении проверяется версия сущности (обычно поле @Version). Если версия изменилась с момента чтения — выбрасывается исключение OptimisticLockException.
  • Позволяет избежать блокировок на уровне базы, повышая производительность.

Под капотом: Hibernate добавляет в сущность поле версии, при обновлении проверяет, что версия в базе совпадает с версией в памяти, и увеличивает её.

Когда применять:

  • Когда вероятность конфликтов низкая.
  • В системах с высокой нагрузкой и большим количеством чтений.

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

  • Предполагает, что конфликты вероятны.
  • При чтении данных ставится блокировка на уровне базы (например, SELECT ... FOR UPDATE).
  • Другие транзакции не могут изменить или прочитать заблокированные данные до снятия блокировки.

Под капотом: Hibernate использует SQL-запросы с блокировками, которые удерживаются до конца транзакции.

Когда применять:

  • Когда данные часто изменяются и конфликты вероятны.
  • В критичных секциях, где важно избежать конфликтов.

Итог

  • Оптимистичная блокировка — легковесна, лучше для систем с редкими конфликтами.
  • Пессимистичная — более строгая, подходит для высококонкурентных сценариев.

Выбор зависит от характера приложения и требований к целостности данных.