Theo ánh xạ của bạn, trình tự các hoạt động sẽ như sau:
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);
An cập nhật hoặc một xóa nghĩa là có được khóa độc quyền , ngay cả trên READ_COMMITTED
mức độ cô lập.
Nếu một giao dịch khác muốn cập nhật cùng một hàng với giao dịch đang chạy hiện tại (đã khóa hàng này được đề cập), bạn sẽ không gặp phải bế tắc mà là khóa thời gian chờ chuyển đổi ngoại lệ.
Vì bạn gặp sự cố, điều đó có nghĩa là bạn có được các ổ khóa trên nhiều bảng và việc mua lại khóa không được sắp xếp đúng thứ tự.
Vì vậy, hãy đảm bảo rằng các phương thức lớp dịch vụ thiết lập ranh giới giao dịch, không phải phương thức DAO. Tôi thấy bạn đã khai báo get và tìm phương pháp sử dụng HỖ TRỢ, nghĩa là họ sẽ chỉ sử dụng một giao dịch nếu một giao dịch hiện đang được bắt đầu. Tôi nghĩ bạn cũng nên sử dụng REQUIRED cho những cái đó, nhưng chỉ cần đánh dấu chúng là read-only = true
.
Vì vậy, hãy đảm bảo rằng khía cạnh giao dịch áp dụng ranh giới giao dịch trên "mymethod" chứ không phải trên DAO.