Como a @Version
anotação funciona no JPA?
Encontrei várias respostas cujo extrato é o seguinte:
JPA usa um campo de versão em suas entidades para detectar modificações simultâneas no mesmo registro de armazenamento de dados. Quando o tempo de execução JPA detecta uma tentativa de modificar simultaneamente o mesmo registro, ele lança uma exceção para a última tentativa de confirmação da transação.
Mas ainda não tenho certeza de como funciona.
Também a partir das seguintes linhas:
Você deve considerar os campos de versão imutáveis. A alteração do valor do campo tem resultados indefinidos.
Isso significa que devemos declarar nosso campo de versão como final
?
UPDATE myentity SET mycolumn = 'new value', version = version + 1 WHERE version = [old.version]
. Se alguém atualizou o registro,old.version
não corresponderá mais ao do banco de dados e a cláusula where impedirá que a atualização aconteça. As 'linhas atualizadas' serão0
, que JPA pode detectar para concluir que uma modificação simultânea aconteceu.