¿Cómo funciona la @Version
anotación en JPA?
Encontré varias respuestas cuyo extracto es el siguiente:
JPA usa un campo de versión en sus entidades para detectar modificaciones simultáneas en el mismo registro de almacén de datos. Cuando el tiempo de ejecución de JPA detecta un intento de modificar simultáneamente el mismo registro, lanza una excepción a la transacción que intenta confirmarse en último lugar.
Pero todavía no estoy seguro de cómo funciona.
También a partir de las siguientes líneas:
Debe considerar los campos de versión inmutables. Cambiar el valor del campo tiene resultados indefinidos.
¿Significa que deberíamos declarar nuestro campo de versión como final
?
UPDATE myentity SET mycolumn = 'new value', version = version + 1 WHERE version = [old.version]
. Si alguien actualizó el registro,old.version
ya no coincidirá con el de la base de datos y la cláusula where evitará que se realice la actualización. Las 'filas actualizadas' serán0
, que JPA puede detectar para concluir que ocurrió una modificación concurrente.