Oracle
 sql >> Base de données >  >> RDS >> Oracle

Pourquoi mon verrouillage pessimiste dans JPA avec Oracle ne fonctionne pas

Enfin j'ai réussi à le faire fonctionner mais avec quelques modifications. L'idée est d'utiliser LockModeType.PESSIMISTIC_FORCE_INCREMENT au lieu de PESSIMISTIC_WRITE. En utilisant ce mode de verrouillage, les tâches Cron se comportent comme suit :

  1. Lorsque la première tâche effectue la sélection pour la mise à jour, tout se passe comme prévu, mais la version de l'objet change.
  2. Si une autre tâche essaie d'effectuer la même sélection alors que la première est toujours sur sa transaction, JPA lance une exception OptimisticLockException. Ainsi, si vous interceptez cette exception, vous pouvez être sûr qu'elle a été levée pour un verrou en lecture.

Cette solution a plusieurs équivalents :

  1. SynchronizedCronJobTask doit avoir un champ de version et être sous contrôle de version avec @Version
  2. Vous devez gérer OptimisticLockException, et il doit être intercepté en dehors de la méthode de service transactionnel afin d'effectuer une restauration lorsque le verrouillage se produit.
  3. IMHO n'est pas une solution élégante, bien pire qu'un simple verrou où les tâches Cron attendent que les tâches précédentes se terminent.