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.