मेरे वेब एप्लिकेशन में मेरे पास कई थ्रेड हैं जो एक ही डेटा को संभावित रूप से एक्सेस करते हैं, मैंने क्यों आशावादी (संस्करण) और हाइबरनेट के साथ निराशावादी लॉकिंग को लागू करने का निर्णय लिया।किसी इकाई को सही तरीके से लॉक और पुनः लोड करने के लिए कैसे करें
वर्तमान में मैं एक इकाई ताला और (@Transactional साथ स्प्रिंग्स लेन-देन प्रबंधक और लेन-देन सीमांकन का प्रयोग करके) उस पर लिखने कार्रवाई करने निम्नलिखित पैटर्न का उपयोग करें:
@Transactional
public void doSomething(entity) {
session.lock(entity, LockMode.UPGRADE);
session.refresh(entity);
// I change the entity itself as well as entites in a relationship.
entity.setBar(...);
for(Child childEntity : entity.getChildren()) {
childEntity.setFoo(...);
}
}
लेकिन, कभी कभी मैं StaleObjectException
जब हो रही है @ ट्रांजैक्शनल फ्लशिंग है जो मुझे बताता है कि एक चाइल्डएन्टिटी को समवर्ती रूप से संशोधित किया गया है और अब गलत संस्करण है।
मुझे लगता है मैं कर रहा हूँ सही ढंग से entity
और उसके बच्चों रिफ्रेश नहीं हो तो मैं पुराना डेटा के साथ काम कर रहा हूँ। क्या कोई यह बता सकता है कि इसे कैसे प्राप्त किया जाए? मेरे कुछ विचारों में दृढ़ता संदर्भ (सत्र) को साफ़ करना या session.lock(entity, LockMode.READ)
को फिर से कॉल करना शामिल था, लेकिन मुझे यकीन नहीं है कि यहां क्या सही है।
आपकी मदद के लिए धन्यवाद!
मैं MySQL InnoDB का उपयोग कर रहा हूं जो "चयन ... अद्यतन के लिए" का समर्थन करता है, इसलिए मुझे यहां कोई समस्या नहीं दिखाई दे रही है। इसके अलावा, एक समवर्ती संशोधन किए जाने पर "अधिसूचना" प्राप्त करने के लिए, मैं आशावादी लॉकिंग भी कर रहा हूं। – Erik
क्षमा करें, इस बिंदु को याद किया कि आपको बच्चों के साथ समस्या है (जो बोल्ड में है :))। मैंने जवाब अपडेट किया है ... – Stas
मेरे कोड में मैं हमेशा इकाई को लॉक करता हूं, भले ही मैं केवल इकाई को अद्यतन नहीं करना चाहता हूं। तो लॉक अधिग्रहित भी होना चाहिए। मेरी मुख्य चिंता actuall यह है कि मैं केवल ताज़ा उपयोग करके नवीनतम इकाई/बच्चों के साथ काम नहीं कर रहा हूँ। – Erik