sql >> Database >  >> RDS >> Oracle

Waarom mijn pessimistische Locking in JPA met Oracle niet werkt

Eindelijk is het me gelukt om het te laten werken, maar met enkele aanpassingen. Het idee is om LockModeType.PESSIMISTIC_FORCE_INCREMENT te gebruiken in plaats van PESSIMISTIC_WRITE. Bij gebruik van deze vergrendelingsmodus gedragen de Cron Jobs zich als volgt:

  1. Als de eerste taak de selectie voor update maakt, gaat alles zoals verwacht, maar de versie van het object verandert.
  2. Als een andere taak dezelfde selectie probeert te maken terwijl de eerste nog in de transactie is, lanceert JPA een OptimisticLockException, dus als u die uitzondering opvangt, kunt u er zeker van zijn dat deze werd gegenereerd voor een leesvergrendeling.

Deze oplossing heeft verschillende tegenhangers:

  1. SynchronizedCronJobTask moet een versieveld hebben en onder versiebeheer staan ​​met @Version
  2. U moet OptimisticLockException afhandelen en het moet buiten de transactieservicemethode worden opgevangen om terugdraaien mogelijk te maken wanneer de vergrendeling plaatsvindt.
  3. IMHO is een niet-elegante oplossing, veel erger dan gewoon een slot waar de Cron Jobs wachten tot de vorige Jobs klaar zijn.


  1. Postgres:vacuümcommando ruimt dode tupels niet op

  2. Verbind SQL Server met SugarCRM

  3. Entiteitsframework erg traag om voor de eerste keer te laden na elke compilatie

  4. Wijzig de taal voor de huidige sessie in SQL Server