es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Anotación Spring Data Jpa @Lock con @Transactional.

Según la documentación de Java para las anotaciones @Lock:

Anotación utilizada para especificar el LockModeType que se utilizará al ejecutar la consulta. Se evaluará al utilizar la consulta en un método de consulta o si deriva la consulta del nombre del método.

Como se mencionó anteriormente, se evaluará con la anotación @Query o el método findBySomething().

Sin embargo, según mis hallazgos, cuando pongo la anotación @Lock con @Transactional en cualquier método y obtengo un registro de la base de datos en ese método de transacción, adquiere un bloqueo en las filas de la base de datos, lo cual no debería ser ideal (corríjame si estoy equivocado):

Verifiqué esto con dos transacciones T1 y T2 de la siguiente manera:

1) Inicio T1 primero, y obtengo algunos registros de la base de datos, duermo ese hilo y no los actualizo.

2) Ahora inicio T2 en otro método teniendo la misma anotación @Lock con escritura pesimista y anotación @Transactional y obtengo los mismos registros e intento actualizarlos, pero cuando intenta confirmar esos cambios, espera un tiempo y luego arroja una excepción diciendo que hay una excepción de tiempo de espera del bloqueo pesimista.

También, cuando se llama a # statement 1, no se dispara la consulta “select for update” sino solo una consulta select.

¿Es cierto que se puede usar @Lock con @Transactional y todas las filas que se obtienen bajo esta transacción obtienen bloqueo?

Utilizando la versión de SpringBoot 2.1.4.RELEASE.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Basado en la documentación de Java para anotaciones @Lock, la anotación se utiliza para especificar el tipo de LockModeType a utilizar al ejecutar una consulta. Esto será evaluado al utilizar Query en un método de consulta o si deriva la consulta del nombre del método.

    Sin embargo, el hallazgo del experto en TI sugiere que la anotación @Lock también se puede utilizar con @Transactional en cualquier método. Cuando un registro se obtiene de la base de datos dentro del método transaccional que tiene la anotación @Lock, se adquiere un bloqueo en las filas de la base de datos.

    El experto verificó esto con dos transacciones T1 y T2, y descubrió que T2 puede adquirir el bloqueo en las filas recuperadas por T1 utilizando la anotación @Lock con escritura pesimista.

    Por lo tanto, parece cierto que @Lock puede ser utilizado con @Transactional y todas las filas obtenidas bajo esta transacción obtienen el bloqueo. Sin embargo, es importante tener en cuenta que el comportamiento puede variar dependiendo de la versión de SpringBoot utilizada. En este caso, el experto utilizó la versión SpringBoot 2.1.4.RELEASE.

Comments are closed.