Вы можете использовать две стратегии.
Первая - это оптимистическая блокировка.Это позволяет выявлять такого рода ситуации и разрешать их путем сбоя второй транзакции.Это означает, что
T1 фиксирует значение A как 700.
приводит к javax.persistence.OptimisticLockException
.Чтобы реализовать эту стратегию, вы должны создать специальный столбец в сущности A
, представляющий версию текущего кортежа, и добавить к ней аннотацию javax.persistence.Version
.После каждой фиксации провайдер Jpa будет автоматически увеличивать столбец версии и проверять его значение при каждой фиксации следующим образом:
1. T1 reads value of A (v1) as 500, T2 reads value of A (v1) as 500 .
2. T1 does A = 500 + 200.
3. T2 does A = 500 -100.
4. T2 commits value of A as 400 - db and entity versions are the same
5. T1 commits Value of A (v1) as 700 - version mismatch: db version is v2 and current version is v1 -> OptimisticLockException
Вторая стратегия - это пессимистическая блокировка (эксклюзивная блокировка): она разрешает первую транзакцию (T1 из вашегопример), чтобы заблокировать Tuple от чтения \ записи его из другой транзакции, пока он не снимет блокировку при коммите \ откате.Вы можете добиться этого, вызвав javax.persistence.EntityManager#lock
с javax.persistence.LockModeType#WRITE
в качестве второго аргумента.