Ответ
Аннотация @Version в JPA предназначена для реализации механизма оптимистичной блокировки (optimistic locking). Этот подход разрешает конфликты параллельных изменений данных на уровне приложения, а не базы данных.
Зачем это нужно? Чтобы безопасно обрабатывать сценарии, когда несколько пользователей или процессов одновременно читают, а затем пытаются обновить одну и ту же запись.
Как это работает (шаги):
- Чтение: Транзакция A и транзакция B читают сущность
Productсversion=1. - Изменение и сохранение A: Транзакция A изменяет сущность и вызывает
entityManager.merge(). Hibernate выполняетUPDATE product SET ..., version=2 WHERE id=123 AND version=1. Успешно,versionв БД становится 2. - Попытка сохранения B: Транзакция B (все еще работающая со «старой» копией, где
version=1) пытается сохранить свои изменения. ЗапросUPDATE ... WHERE id=123 AND version=1не найдет строк для обновления, так как текущая версия в БД уже 2. - Исключение: Hibernate фиксирует 0 обновленных строк и выбрасывает
OptimisticLockException. Транзакция B должна обработать это исключение (например, повторить операцию с актуальными данными).
Типичное использование:
@Entity
public class Document {
@Id
private Long id;
@Version
private Integer version; // Используется для оптимистичной блокировки
private String content;
}
Ключевое преимущество: Высокая производительность, так как блокировки на уровне БД не удерживаются долго.