sql >> Databasteknik >  >> RDS >> Oracle

Varför kastar Hibernate org.hibernate.exception.LockAcquisitionException?

Enligt din mappning ska operationssekvensen se ut så här:

Person p = DAO.findPerson(id);

Car car = new Car();
car.setPerson(p);

DAO.saveOrUpdate(car);

p.getCars().add(car);

Car firstCar = p.getCars().get(0);
firstCar.setPerson(null);
p.getCars().remove(firstCar);
if (p.officialCar.equals(firstCar)) {
   p.officialCar = null;
   p.officialCar.person = null;
}

DAO.delete(firstCar);

En uppdatering eller en delete innebär att skaffa ett exklusivt lås , även på READ_COMMITTED isoleringsnivå.

Om en annan transaktion vill uppdatera samma rad med den aktuella transaktionen (som redan låste den här raden i fråga) får du inte ett dödläge, utan en tidsgräns för låsning undantag.

Eftersom du har ett dödläge betyder det att du skaffar lås på flera bord och att låsförvärven inte är korrekt ordnade.

Så se till att servicelagermetoderna anger transaktionsgränserna, inte DAO-metoderna. Jag ser att du deklarerade get och hitta metoder för att använda SUPPORTED, vilket innebär att de kommer att använda en transaktion endast om en för närvarande är påbörjad. Jag tycker att du ska använda REQUIRED för dessa också, men markera dem helt enkelt som read-only = true .

Så se till att transaktionsaspekten tillämpar transaktionsgränsen på "mymethod" och inte på DAO.



  1. PL SQL:Hur man visar nanosekunder av en TIMESTAMP

  2. Tidsskillnad mellan slutdatum för första poster till nästa post första datum

  3. Föregående/nästa knappar?

  4. MySQL Question - Unique Key Fungerar inte korrekt, eller missförstår jag?