Вопрос проверяет знание практической реализации optimistic locking в JPA и понимание того, как ORM предотвращает потерю обновлений.
В JPA optimistic locking реализуется с помощью поля версии. Это поле помечается аннотацией @Version. При каждом обновлении сущности версия увеличивается. Если при сохранении версия в базе отличается от версии в объекте, JPA выбрасывает исключение. Таким образом предотвращается перезапись чужих изменений.
Optimistic locking в JPA встроен на уровне ORM и не требует явной работы с блокировками в SQL.
Optimistic locking в JPA — это механизм контроля конкурентных изменений, основанный на проверке версии сущности при выполнении UPDATE.
Перед тем как разобрать шаги, важно понять ключевую идею: каждая строка хранит номер версии.
Сущность загружается из базы вместе с полем версии
Приложение изменяет объект
При flush или commit Hibernate формирует UPDATE с условием по версии
Если обновлено 0 строк — считается конфликт версий
@Entity
public class Order {
@Id
private Long id;
@Version
private Long version;
private String status;
}
UPDATE orders SET status = ?, version = version + 1 WHERE id = ? AND version = ?
Если версия не совпала — обновление не происходит
Hibernate выбрасывает OptimisticLockException
Приложение решает, что делать дальше:
повторить операцию
показать ошибку пользователю
отменить бизнес-операцию
Optimistic locking в JPA прост в использовании, хорошо масштабируется и подходит для большинства бизнес-сценариев с редкими конфликтами.