sql >> Databáze >  >> RDS >> Oracle

Proč moje pesimistické zamykání v JPA s Oracle nefunguje

Nakonec se mi to podařilo, ale s několika úpravami. Cílem je použít LockModeType.PESSIMISTIC_FORCE_INCREMENT namísto PESSIMISTIC_WRITE. Při použití tohoto režimu uzamčení se úlohy Cron chovají následovně:

  1. Když první úloha provede výběr aktualizace, vše proběhne podle očekávání, ale změní se verze objektu.
  2. Pokud se jiná úloha pokusí provést stejný výběr, zatímco první je stále v transakci, JPA spustí výjimku OptimisticLockException, takže pokud tuto výjimku zachytíte, můžete si být jisti, že byla vyvolána pro zámek čtení.

Toto řešení má různé protějšky:

  1. SynchronizedCronJobTask musí mít pole verze a musí být pod kontrolou verzí pomocí @Version
  2. Musíte zpracovat výjimku OptimisticLockException a měla by být zachycena mimo metodu transakční služby, aby bylo možné provést vrácení zpět, když dojde k odemknutí.
  3. IMHO je neelegantní řešení, mnohem horší než pouhý zámek, kde Cron Jobs čeká na dokončení předchozích úloh.


  1. ORA-00984:sloupec zde není povolen

  2. Jak funguje funkce FORMAT() v SQL Server (T-SQL)

  3. Chyba 1033 přijala přihlášení do pohotovostního režimu

  4. MySQL „NOT IN“ dotazuje 3 tabulky