Назад к вопросам
Senior
6
Что такое оптимистичная и пессимистичная блокировки в JPA/Hibernate? Как устроены под капотом? В каких случаях что применять?
Компании, где спрашивали
Позитив Технолоджис
Ответ от нейросети
sobes.tech AI
Оптимистичная блокировка и пессимистичная блокировка — два подхода к управлению конкурентным доступом к данным в JPA/Hibernate.
Оптимистичная блокировка
- Основана на предположении, что конфликты редки.
- При чтении данных блокировки не ставятся.
- При сохранении проверяется версия сущности (обычно поле
@Version). Если версия изменилась с момента чтения — выбрасывается исключениеOptimisticLockException. - Позволяет избежать блокировок на уровне базы, повышая производительность.
Под капотом: Hibernate добавляет в сущность поле версии, при обновлении проверяет, что версия в базе совпадает с версией в памяти, и увеличивает её.
Когда применять:
- Когда вероятность конфликтов низкая.
- В системах с высокой нагрузкой и большим количеством чтений.
Пессимистичная блокировка
- Предполагает, что конфликты вероятны.
- При чтении данных ставится блокировка на уровне базы (например,
SELECT ... FOR UPDATE). - Другие транзакции не могут изменить или прочитать заблокированные данные до снятия блокировки.
Под капотом: Hibernate использует SQL-запросы с блокировками, которые удерживаются до конца транзакции.
Когда применять:
- Когда данные часто изменяются и конфликты вероятны.
- В критичных секциях, где важно избежать конфликтов.
Итог
- Оптимистичная блокировка — легковесна, лучше для систем с редкими конфликтами.
- Пессимистичная — более строгая, подходит для высококонкурентных сценариев.
Выбор зависит от характера приложения и требований к целостности данных.