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

Hvorfor min pessimistiske låsning af JPA med Oracle ikke virker

Til sidst lykkedes det mig at få det til at virke, men med nogle ændringer. Ideen er at bruge LockModeType.PESSIMISTIC_FORCE_INCREMENT i stedet for PESSIMISTIC_WRITE. Ved at bruge denne låsetilstand opfører Cron Jobs sig som følger:

  1. Når det første job gør valget til opdatering går alt som forventet, men versionen på objektet ændres.
  2. Hvis et andet job forsøger at foretage det samme valg, mens det første stadig er i sin transaktion, lancerer JPA en OptimisticLockException, så hvis du fanger den undtagelse, kan du være sikker på, at den blev kastet for en læselås.

Denne løsning har forskellige modstykker:

  1. SynchronizedCronJobTask skal have et versionsfelt og være under versionskontrol med @Version
  2. Du skal håndtere OptimisticLockException, og det bør være catch uden for transaktionsservicemetoden for at foretage tilbagerulning, når delock sker.
  3. IMHO er en ikke-elegant løsning, meget værre end blot en lås, hvor Cron Jobs venter på, at de tidligere Jobs er færdige.


  1. Sådan ekko ud tabelrækker fra db (php)

  2. Sådan opdeles streng og indsætte værdier i tabel i SQL Server

  3. MySQL join med where-klausul

  4. MS-Access Class Module og VBA