आपके मानचित्रण के अनुसार, संचालन का क्रम इस तरह दिखना चाहिए:
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);
एक अपडेट या हटाएं मतलब एक अनन्य लॉक acquiring प्राप्त करना , यहां तक कि READ_COMMITTED
पर भी
अलगाव स्तर।
यदि कोई अन्य लेन-देन वर्तमान चल रहे लेन-देन के साथ उसी पंक्ति को अपडेट करना चाहता है (जो पहले से ही इस पंक्ति को प्रश्न में बंद कर चुका है) तो आपको एक गतिरोध नहीं मिलेगा, लेकिन एक लॉक अधिग्रहण समयबाह्य अपवाद।
चूंकि आपके पास गतिरोध है, इसका मतलब है कि आप एकाधिक तालिकाओं पर ताले प्राप्त करते हैं और ताला अधिग्रहण ठीक से आदेशित नहीं होते हैं।
इसलिए, सुनिश्चित करें कि सेवा परत विधियाँ लेन-देन की सीमाएँ निर्धारित करती हैं, न कि DAO विधियाँ। मैं देख रहा हूं कि आपने प्राप्त . घोषित कर दिया है और ढूंढें समर्थित का उपयोग करने के तरीके, जिसका अर्थ है कि वे लेन-देन का उपयोग केवल तभी करेंगे जब कोई वर्तमान में प्रारंभ हो। मुझे लगता है कि आपको उनके लिए भी REQUIRED का उपयोग करना चाहिए, लेकिन बस उन्हें read-only = true
के रूप में चिह्नित करें ।
इसलिए सुनिश्चित करें कि लेन-देन पहलू "mymethod" पर लेन-देन की सीमा लागू करता है न कि DAO वालों पर।