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

Hvorfor kaster Hibernate org.hibernate.exception.LockAcquisitionException?

I henhold til din kortlægning skal rækkefølgen af ​​operationer se sådan ud:

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 opdatering eller en slet betyder at anskaffe en eksklusiv lås , selv på READ_COMMITTED isolationsniveau.

Hvis en anden transaktion ønsker at opdatere den samme række med den aktuelle kørende transaktion (som allerede har låst denne pågældende række), vil du ikke få et dødvande, men en timeout for låseanskaffelse undtagelse.

Da du har et dødvande, betyder det, at du erhverver låse på flere borde, og låseopkøbene ikke er korrekt ordnet.

Så sørg for, at servicelagmetoderne sætter transaktionsgrænserne, ikke DAO-metoderne. Jeg kan se, at du erklærede get og find metoder til at bruge SUPPORTED, hvilket betyder, at de kun vil bruge en transaktion, hvis en i øjeblikket er startet. Jeg synes, du også skal bruge REQUIRED til dem, men marker dem blot som read-only = true .

Så sørg for, at transaktionsaspektet anvender transaktionsgrænsen på "mymetoden" og ikke på DAO.



  1. Indsætte hele DataTable i databasen på én gang i stedet for række for række?

  2. Opdater primærnøgle Django MySQL

  3. Sådan konverteres dato i .csv-fil til SQL-format før masseindsættelse

  4. hvordan man kører en mysql-forespørgsel i yii