sql >> Base de Datos >  >> RDS >> Oracle

¿Por qué mi bloqueo pesimista en JPA con Oracle no funciona?

Finalmente logré hacerlo funcionar pero con algunas modificaciones. La idea es usar LockModeType.PESSIMISTIC_FORCE_INCREMENT en lugar de PESSIMISTIC_WRITE. Con este modo de bloqueo, los trabajos cron se comportan de la siguiente manera:

  1. Cuando el primer trabajo selecciona la actualización, todo sale como se esperaba, pero la versión del objeto cambia.
  2. Si otro trabajo intenta hacer la misma selección mientras el primero todavía está en su transacción, JPA lanza una OptimisticLockException, por lo que si detecta esa excepción, puede estar seguro de que se lanzó para un bloqueo de lectura.

Esta solución tiene varias contrapartes:

  1. SynchronizedCronJobTask debe tener un campo de versión y estar bajo control de versión con @Version
  2. Debe manejar OptimisticLockException, y debe capturarse fuera del método de servicio transaccional para poder revertir cuando ocurra el bloqueo.
  3. En mi humilde opinión, no es una solución elegante, mucho peor que un simple bloqueo en el que los trabajos de Cron esperan a que finalicen los trabajos anteriores.