Според вашето съпоставяне последователността от операции трябва да изглежда така:
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);
Актуализация или изтриване означава придобиване на изключително заключване , дори на READ_COMMITTED
ниво на изолация.
Ако друга транзакция иска да актуализира същия ред с текущата изпълнявана транзакция (която вече е заключила въпросния ред), няма да получите блокиране, а време за изчакване за придобиване на заключване изключение.
Тъй като имате блокиране, това означава, че придобивате заключвания на множество маси и придобиванията на заключвания не са правилно подредени.
Така че, уверете се, че методите на сервизния слой задават границите на транзакцията, а не методите DAO. Виждам, че си деклариралполучаването инамиране методи за използване ПОДДЪРЖАНИ, което означава, че ще използват транзакция само ако такава е стартирана в момента. Мисля, че трябва да използвате REQUIRED и за тях, но просто ги маркирайте като read-only = true
.
Така че се уверете, че аспектът на транзакцията прилага границата на транзакцията към „mymethod“, а не към тези на DAO.