Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Warum löst Hibernate org.hibernate.exception.LockAcquisitionException aus?

Entsprechend Ihrem Mapping sollte die Abfolge der Operationen wie folgt aussehen:

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);

Ein Update oder ein Löschen bedeutet, eine exklusive Sperre zu erwerben , sogar auf READ_COMMITTED Isolationsstufe.

Wenn eine andere Transaktion dieselbe Zeile mit der aktuell laufenden Transaktion (die diese betreffende Zeile bereits gesperrt hat) aktualisieren möchte, erhalten Sie keinen Deadlock, sondern ein Zeitlimit für die Sperrung Ausnahme.

Da Sie einen Deadlock haben, bedeutet dies, dass Sie Sperren für mehrere Tabellen erwerben und die Sperren nicht richtig geordnet sind.

Stellen Sie also sicher, dass die Methoden der Serviceschicht die Transaktionsgrenzen festlegen, nicht die DAO-Methoden. Wie ich sehe, haben Sie das get deklariert und finden Methoden zur Verwendung von SUPPORTED, was bedeutet, dass sie eine Transaktion nur dann verwenden, wenn gerade eine gestartet wird. Ich denke, Sie sollten auch REQUIRED für diese verwenden, aber markieren Sie sie einfach als read-only = true .

Stellen Sie also sicher, dass der Transaktionsaspekt die Transaktionsgrenze auf die "mymethod" und nicht auf die DAO-Methoden anwendet.