2012-04-12 17 views
11

मेरे पास हाइबरनेट में आशावादी लॉकिंग के बारे में एक प्रश्न है। मैं हाइबरनेट के साथ आशावादी लॉकिंग के अंदर गहरी जाने की कोशिश कर रहा हूं, लेकिन मुझे एक संदेह है। आशावादी लॉकिंग को लागू करने के लिए हाइबरनेट संस्करण दृष्टिकोण (पूर्णांक या टाइमस्टैम्प) का उपयोग करता है। कॉन्फ़िगर करने के लिए आप @Version एनोटेशन (या एक्सएमएल कॉन्फ़िगरेशन) का उपयोग कर सकते हैं और एक संस्करण विशेषता बना सकते हैं। दूसरा विकल्प आशावादी-लॉक = "सभी" विशेषता का उपयोग कर वर्जनिंग के बिना कॉन्फ़िगर कर रहा है।डिफ़ॉल्ट रूप से हाइबरनेट में ऑप्टिस्टिक लॉकिंग

मेरा प्रश्न यह है कि यदि आप किसी संस्करण संस्करण को परिभाषित नहीं करते हैं और आप आशावादी-लॉक विशेषता निर्दिष्ट नहीं करते हैं, तो कौन सी रणनीति इस मामले में हाइबरनेट का उपयोग करती है? Pessimistc लॉकिंग मुझे पूरा यकीन है कि नहीं, तो मुझे लगता है कि आशावादी लॉकिंग है लेकिन यह नहीं पता कि कैसे।

आपके ध्यान के लिए बहुत बहुत धन्यवाद।

उत्तर

33

यदि आप आशावादी लॉकिंग का उपयोग करने के लिए हाइबरनेट को कॉन्फ़िगर नहीं करते हैं, तो यह बिल्कुल लॉकिंग का उपयोग नहीं करता है। तो, इस मामले में अंतिम अद्यतन हमेशा जीतता है।

बस इसे स्पष्ट करने के लिए, ध्यान दें कि हाइबरनेट आशावादी लॉकिंग डीबीएमएस लेनदेन अलगाव से पूरी तरह से अलग है। हाइबरनेट ऑप्टिस्टिक लॉकिंग केवल स्थिति में काम करता है जब आप ऑब्जेक्ट को एक लेनदेन में लोड करते हैं, इसे संशोधित करते हैं और बाद में इसे दूसरे लेनदेन में सहेजते हैं। इस मामले में आशावादी लॉकिंग सुनिश्चित करता है कि कुछ अन्य लेनदेन ने डेटाबेस में उस ऑब्जेक्ट को बीच में नहीं बदला है। हालांकि, आशावादी लॉकिंग समवर्ती लेनदेन के अलगाव को प्रभावित नहीं करता है - इसलिए, लेनदेन अलगाव को लागू करने के लिए आंतरिक रूप से डीबीएमएस द्वारा उपयोग किए जाने वाले ताले (आशावादी या निराशावादी) अभी भी काम करते हैं, इससे कोई फर्क नहीं पड़ता कि हाइबरनेट लॉकिंग सक्षम है या नहीं।

3

@axtavt, आप सही हैं, लेकिन @Version कॉलम के बिना आशावादी लॉकिंग को कैसे हाइबरनेट लागू करें।

आज चार OptimisticLockType विकल्प उपलब्ध:

/** 
* Perform no optimistic locking. 
*/ 
NONE, 
/** 
* Perform optimistic locking using a dedicated version column. 
* 
* @see javax.persistence.Version 
*/ 
VERSION, 
/** 
* Perform optimistic locking based on *dirty* fields as part of an expanded WHERE clause restriction for the 
* UPDATE/DELETE SQL statement. 
*/ 
DIRTY, 
/** 
* Perform optimistic locking based on *all* fields as part of an expanded WHERE clause restriction for the 
* UPDATE/DELETE SQL statement. 
*/ 
ALL 

मुझे लगता है कि इस मूल सवाल का जवाब देने के लिए पर्याप्त है।