2012-11-26 24 views
16

जेपीए के साथ, हम लेनदेन में इकाई परिवर्तनों को संभालने के लिए मैन्युअल रूप से OPTIMISTIC या PESSIMISTIC लॉकिंग का उपयोग कर सकते हैं।जेपीए और डिफ़ॉल्ट लॉकिंग मोड

मुझे आश्चर्य है कि अगर हम इन 2 मोड में से किसी एक को निर्दिष्ट नहीं करते हैं तो जेपीए लॉकिंग कैसे करता है? कोई लॉकिंग मोड का उपयोग नहीं किया जाता है?

यदि हम एक स्पष्ट लॉकिंग मोड को परिभाषित नहीं करते हैं, तो डेटाबेस अखंडता खो सकती है?

धन्यवाद

उत्तर

13

मैं खंड 3.4.4 लॉक मोडJava Persistence API 2.0 Final Release विनिर्देश के माध्यम से स्कैन किया है और यह नहीं बताता है, जबकि मैं कुछ भी नहीं मिला विशिष्ट (कि इस डिफ़ॉल्ट है या ऐसा कुछ भी) एक फुटनोट है जो निम्नलिखित कहता है।

लॉक मोड प्रकार को लॉक मोड तर्कों के मान के रूप में निर्दिष्ट किया जा सकता है और एनोटेशन के लिए डिफ़ॉल्ट मान भी प्रदान करता है।

अनुभाग LockModeType मूल्यों के प्रकार और उनके उपयोग के बारे में है और वर्णन करता है कि कौन सी विधियां इस तरह के तर्क और क्या नहीं हैं।

तो, के रूप में यह कहा LockModeType.NONE एनोटेशन के लिए डिफ़ॉल्ट है (जेपीए, एनोटेशन छोड़ दिया और सही) मुझे लगता है कि जब आप EntityManager.find(Class, Object) का उपयोग डिफ़ॉल्ट LockModeType प्रयोग किया जाता है।

कुछ अन्य हैं, सूक्ष्म, इसे मजबूत करने के लिए संकेत। खंड 3.1.1 EntityManager इंटरफ़ेस

खोज विधि (बशर्ते वह एक ताला किए बिना आमंत्रित या LockModeType.NONE साथ शुरू हो जाती है) और getReference विधि एक सौदे के संदर्भ में लागू होने की आवश्यकता नहीं है।

यह समझ में आता है। उदाहरण के लिए यदि आप MySQL का उपयोग अपने डेटाबेस के रूप में करते हैं और आपके डेटाबेस इंजन का विकल्प InnoDB है (डिफ़ॉल्ट रूप से) आपकी तालिका REPEATABLE READ का उपयोग करेगी, यदि आप कुछ अन्य आरडीबीएमएस या अन्य डेटाबेस इंजन का उपयोग कर सकते हैं तो यह बदल सकता है।

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

मुझे an article regarding isolation levels and lock modes भी मिला है, तो आप इसे पढ़ना चाहेंगे।

ओह, और अपने अंतिम प्रश्न का उत्तर देने के लिए।

यदि हम एक स्पष्ट लॉकिंग मोड को परिभाषित नहीं करते हैं, तो डेटाबेस अखंडता खो जा सकती है?

यह निर्भर करता है, लेकिन अगर आप समवर्ती लेनदेन है तो इस सवाल का जवाब शायद हाँ है।

+0

इस रचनात्मक उत्तर और लिंक के लिए धन्यवाद। मैं फिर से पढ़ूंगा और LockModeType.NONE को समझने की कोशिश करूंगा और इसका क्या अर्थ है। तथ्य यह है कि मैं जेपीए के साथ नया हूं और मुझे यह नहीं पता कि सटीक अखंडता के साथ रखने के लिए मुझे किस इकाई (ies) को लॉक करना चाहिए। यह शायद उबाऊ है लेकिन मैं लेनदेन सिमुलेशन (थ्रेड.sleep()) के साथ सभी मोड का परीक्षण करूंगा। एक बार फिर धन्यवाद –

9

जेपीए 2.1 एफआर

के कारण

3,2 संस्करण गुण

संस्करण क्षेत्र या संपत्ति हठ प्रदाता द्वारा प्रयोग किया जाता है आशावादी लॉक करने के लिए। यह इकाई उदाहरण पर जीवन चक्र संचालन करने के दौरान दृढ़ता प्रदाता द्वारा उपयोग और/या सेट किया जाता है। ऑप्टिमाइस्टिक लॉकिंग के लिए एक इकाई स्वचालित रूप से सक्षम होती है यदि उसके पास एक संस्करण मैपिंग के साथ मैप किया गया कोई प्रॉपर्टी या फ़ील्ड है।

तो अगर इकाई एक संस्करणीकृत वस्तु, इस तरह के रूप में एक @version निर्दिष्ट किया गया है है, तो डिफ़ॉल्ट हठ प्रदाता आशावादी ताला प्रदर्शन करेंगे।

3

विनिर्देश persistence_2.0 में, पृष्ठ 89:

एक संस्करणीकृत वस्तु अन्यथा अपडेट करने या निकालने जाता है, तो कार्यान्वयन सुनिश्चित करना चाहिए कि LockModeType.OPTIMISTIC_FORCE_INCREMENT की की जरूरतें पूरी नहीं कर रहे हैं, यहां तक ​​कि कोई स्पष्ट करता है, तो EntityManager.lock को कॉल किया गया था।

0

फार्म जवाब पहले से यहाँ प्रस्तुत, ऐसा लगता है जेपीए निम्नलिखित तरीके से बर्ताव करता है जैसे: मेरे इकाई एक @version एनोटेट क्षेत्र एक नहीं LockModeType स्थापित किया गया है है, तो LockModeType.OPTIMISTIC_FORCE_INCREMENT डिफ़ॉल्ट रूप से स्थापित किया जाएगा। क्या ये सही है ?

संबंधित मुद्दे