Добавить в корзинуПозвонить
Найти в Дзене
Java

Spring Boot: optimistic locking через `@Version

` В JPA/Hibernate можно ловить конфликт обновлений без блокировки строки в базе. Достаточно добавить поле версии: @Entity public class Account { @Id private Long id; private BigDecimal balance; @Version private Long version; } Как это работает: Когда Entity читается из базы, Hibernate забирает текущую версию записи. Например, version = 2. При обновлении он делает update с проверкой этой версии. Если за это время другая транзакция уже изменила запись, версия в базе стала другой. Тогда update не затронет ни одной строки, и Hibernate выбросит OptimisticLockException. Подходит, когда чтений много, записей меньше, а конфликты случаются редко. Плохо подходит, если несколько потоков постоянно меняют одну и ту же запись или нужна строгая сериализация операций. Там уже лучше смотреть в сторону pessimistic locking, очередей или переработки модели записи. @Version особенно полезен для аккаунтов, заказов, настроек, профилей и любых сущностей, где нельзя молча перетереть чужое изменение

Spring Boot: optimistic locking через `@Version`

В JPA/Hibernate можно ловить конфликт обновлений без блокировки строки в базе.

Достаточно добавить поле версии:

@Entity

public class Account {

@Id

private Long id;

private BigDecimal balance;

@Version

private Long version;

}

Как это работает:

Когда Entity читается из базы, Hibernate забирает текущую версию записи. Например, version = 2.

При обновлении он делает update с проверкой этой версии. Если за это время другая транзакция уже изменила запись, версия в базе стала другой.

Тогда update не затронет ни одной строки, и Hibernate выбросит OptimisticLockException.

Подходит, когда чтений много, записей меньше, а конфликты случаются редко.

Плохо подходит, если несколько потоков постоянно меняют одну и ту же запись или нужна строгая сериализация операций. Там уже лучше смотреть в сторону pessimistic locking, очередей или переработки модели записи.

@Version особенно полезен для аккаунтов, заказов, настроек, профилей и любых сущностей, где нельзя молча перетереть чужое изменение.