Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

हाइबरनेट क्यों org.hibernate.exception.LockAccitionException फेंकता है?

आपके मानचित्रण के अनुसार, संचालन का क्रम इस तरह दिखना चाहिए:

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 वालों पर।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle SQL डेवलपर में टेबल एपीआई पैकेज कैसे जनरेट करें?

  2. Oracle:फ़ंक्शन आधारित अनुक्रमणिका चयनात्मक विशिष्टता

  3. MyBatis और Oracle संग्रहित प्रक्रियाओं के साथ बल्क अपडेट करना

  4. 'ग्रुप बाय' का उपयोग किए बिना एग्रीगेट कैसे करें?

  5. कैसे एसक्यूएल में सप्ताह संख्या निकालने के लिए