sql >> Databasteknik >  >> RDS >> Oracle

Varför min pessimistiska låsning av JPA med Oracle inte fungerar

Till slut lyckades jag få det att fungera men med några modifieringar. Tanken är att använda LockModeType.PESSIMISTIC_FORCE_INCREMENT istället för PESSIMISTIC_WRITE. Med detta låsläge beter sig Cron Jobs enligt följande:

  1. När det första jobbet gör valet för uppdatering går allt som förväntat men versionen på objektet ändras.
  2. Om ett annat jobb försöker göra samma val medan det första fortfarande är på sin transaktion, lanserar JPA en OptimisticLockException så om du fångar det undantaget kan du vara säker på att det kastades för ett läslås.

Denna lösning har olika motsvarigheter:

  1. SynchronizedCronJobTask måste ha ett versionsfält och vara under versionskontroll med @Version
  2. Du måste hantera OptimisticLockException, och det bör vara catch utanför transaktionstjänstmetoden för att kunna göra återställning när låsning sker.
  3. IMHO är en icke-elegant lösning, mycket värre än bara ett lås där Cron Jobs väntar på att de tidigare jobben ska avslutas.


  1. Komma igång med Postgres 13 på Ubuntu 20.04

  2. Hur age() fungerar i PostgreSQL

  3. Vad är korrekt JDBC URL-syntax om Oracle-plånböcker används?

  4. Ändra SQL Server-sortering till skiftlägesokänslig från skiftlägeskänslig?