Как работает @Version
аннотация в JPA?
Я нашел несколько ответов, выдержка из которых выглядит следующим образом:
JPA использует поле версии в ваших объектах для обнаружения одновременных изменений одной и той же записи хранилища данных. Когда среда выполнения JPA обнаруживает попытку одновременного изменения одной и той же записи, она генерирует исключение для транзакции, пытающейся зафиксировать последнюю.
Но я до сих пор не понимаю, как это работает.
Также как из следующих строк:
Вы должны считать поля версии неизменными. Изменение значения поля приводит к неопределенным результатам.
Означает ли это, что мы должны объявить поле версии как final
?
UPDATE myentity SET mycolumn = 'new value', version = version + 1 WHERE version = [old.version]
. Если кто-то обновил запись,old.version
она больше не будет соответствовать записи в БД, и предложение where предотвратит обновление. Будут обновлены строки0
, которые JPA может обнаружить, чтобы сделать вывод, что произошла одновременная модификация.