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

Proč Hibernate vyvolá výjimku org.hibernate.exception.LockAcquisitionException?

Podle vašeho mapování by sekvence operací měla vypadat takto:

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

aktualizace nebo smazat znamená získání exkluzivního zámku , a to i na READ_COMMITTED úroveň izolace.

Pokud chce jiná transakce aktualizovat stejný řádek aktuální probíhající transakcí (která již tento řádek uzamkla), nedojde k uváznutí, ale k časovému limitu akvizice zámku výjimka.

Protože jste uvízli na mrtvém bodě, znamená to, že získáváte zámky na více stolech a akvizice zámků nejsou správně seřazeny.

Ujistěte se tedy, že hranice transakcí nastavují metody vrstvy služeb, nikoli metody DAO. Vidím, že jste prohlásili get a najít metody používat PODPOROVANÉ, což znamená, že budou používat transakci pouze v případě, že je aktuálně spuštěna. Myslím, že byste pro ně měli také použít REQUIRED, ale jednoduše je označte jako read-only = true .

Ujistěte se tedy, že aspekt transakce aplikuje hranici transakce na "mymethod" a ne na ty DAO.



  1. 1318 - Nesprávný počet argumentů pro PROCEDURE

  2. Jak vytvořit pole se seznamem cizích klíčů v SQLAlchemy?

  3. PostgreSQL získá a uvolní LOCK uvnitř uložené funkce

  4. IN prohlášení v Eloquent