Oracle
 sql >> Database >  >> RDS >> Oracle

Perché il mio pessimistico blocco in JPA con Oracle non funziona

Finalmente sono riuscito a farlo funzionare ma con alcune modifiche. L'idea è quella di utilizzare LockModeType.PESSIMISTIC_FORCE_INCREMENT invece di PESSIMISTIC_WRITE. Usando questa modalità di blocco i Cron Jobs si comportano come segue:

  1. Quando il primo lavoro effettua la selezione per l'aggiornamento, tutto va come previsto ma la versione sull'oggetto cambia.
  2. Se un altro lavoro tenta di effettuare la stessa selezione mentre il primo è ancora nella sua transazione, JPA lancia un OptimisticLockException quindi se si rileva quell'eccezione si può essere sicuri che sia stata lanciata per un blocco di lettura.

Questa soluzione ha diverse controparti:

  1. SynchronizedCronJobTask deve avere un campo versione ed essere sotto il controllo della versione con @Version
  2. È necessario gestire OptimisticLockException e dovrebbe essere rilevato al di fuori del metodo del servizio transazionale per eseguire il rollback quando si verifica il blocco.
  3. IMHO è una soluzione non elegante, molto peggio di un semplice lucchetto in cui i Cron Jobs aspettano che i lavori precedenti finiscano.