इससे डुप्लिकेट प्रश्न:
/programming/129329/optimistic-vs-pessimistic-locking
उपरोक्त लिंक से उत्तर कॉपी / पेस्ट करना:
आशावादी लॉकिंग एक रणनीति है जहां आप एक रिकॉर्ड पढ़ते हैं, एक संस्करण संख्या पर ध्यान दें और जांच करें कि रिकॉर्ड वापस लिखने से पहले संस्करण बदल नहीं गया है। जब आप रिकॉर्ड वापस लिखते हैं तो आप संस्करण पर अद्यतन फ़िल्टर करते हैं यह सुनिश्चित करने के लिए कि यह परमाणु है। (यानी जब आप संस्करण की जाँच करें और डिस्क पर रिकॉर्ड लिखें) के बीच अद्यतन नहीं किया गया है और संस्करण को एक हिट में अपडेट करें।
यदि रिकॉर्ड गंदा है (यानी आपके लिए अलग संस्करण) तो आप लेनदेन को रोक देते हैं और उपयोगकर्ता इसे फिर से शुरू कर सकता है।
यह रणनीति उच्च-वॉल्यूम सिस्टम और त्रि-स्तरीय आर्किटेक्चर पर लागू होती है, जहाँ आप जरूरी नहीं कि अपने सत्र के लिए डेटाबेस से संबंध बनाए रखें। इस स्थिति में क्लाइंट वास्तव में डेटाबेस लॉक को बनाए नहीं रख सकता क्योंकि कनेक्शन एक पूल से लिए गए हैं और आप एक ही कनेक्शन से अगले तक एक ही कनेक्शन का उपयोग नहीं कर रहे हैं।
निराशावादी लॉकिंग है जब आप अपने अनन्य उपयोग के लिए रिकॉर्ड को लॉक करते हैं जब तक कि आपने इसके साथ समाप्त नहीं किया है। आशावादी लॉकिंग की तुलना में इसकी बेहतर अखंडता है लेकिन आपको डेडलॉक से बचने के लिए अपने एप्लिकेशन डिज़ाइन के साथ सावधान रहना होगा। निराशावादी लॉकिंग का उपयोग करने के लिए आपको डेटाबेस से सीधे कनेक्शन की आवश्यकता होती है (जैसा कि आमतौर पर दो स्तरीय क्लाइंट सर्वर एप्लिकेशन में होता है) या बाहरी रूप से उपलब्ध लेनदेन आईडी जो कनेक्शन के स्वतंत्र रूप से उपयोग की जा सकती है।
बाद के मामले में आप TxID के साथ लेनदेन को खोलते हैं और फिर उस आईडी का उपयोग करके पुन: कनेक्ट करते हैं। DBMS ताले को बनाए रखता है और आपको सत्र को TxID के माध्यम से वापस लेने की अनुमति देता है। यह दो-चरण प्रतिबद्ध प्रोटोकॉल (जैसे XA या COM + लेनदेन) का उपयोग करके लेनदेन कैसे वितरित किया जाता है।
संपादित करें (प्रदर्शन प्रश्न को संबोधित करने के लिए और जानकारी जोड़ना):
प्रदर्शन बुद्धिमान यह आपके पर्यावरण पर निर्भर करता है। निर्णय लेने के लिए निम्नलिखित कारकों में लें:
आप आशावादी खोजने जा रहे हैं ज्यादातर स्थितियों में संगामिति के कारण बेहतर होगा। RDBMS और पर्यावरण के आधार पर यह कम या अधिक प्रदर्शनकारी हो सकता है। आमतौर पर आशावादी लॉकिंग के साथ आप पाएंगे कि मूल्य को कहीं न कहीं पंक्तिबद्ध करने की आवश्यकता है।
उदाहरण के लिए MS SQL Server के साथ, यह TempDB में स्थानांतरित हो जाता है और कॉलम के अंत में 12-14 बाइट्स के बीच कुछ जोड़ा जाता है। स्नैपशॉट अलगाव के रूप में एक अलगाव स्तर के साथ आशावादी लॉकिंग को चालू करने से विखंडन हो सकता है और आपके भरण कारक को समायोजित करने की आवश्यकता होगी क्योंकि अब पंक्तियों में अंत में अतिरिक्त डेटा होता है जो पृष्ठ विभाजन का कारण बनने के लिए पूर्ण पृष्ठ के पास हो सकता है, जो कम होगा आपका प्रदर्शन। यदि आपका TempDB अनुकूलित है, तो यह उतना तेज़ नहीं होगा।
इसलिए मुझे लगता है कि एक चेकलिस्ट है:
- -क्या आपके पास पंक्ति संस्करण के रूप को संभालने के लिए पर्याप्त IO / संसाधन हैं? यदि नहीं, तो आप ओवरहेड जोड़ रहे हैं। यदि ऐसा है, तो यदि आप डेटा को अक्सर पढ़ रहे हैं, जबकि आप इसे लिखने के लिए अक्सर लॉक कर रहे हैं, तो आप पठन और लेखन के दौरान संगामिति पर एक अच्छा सुधार देखेंगे (हालांकि लिखता है फिर भी लिखता है, पढ़ता है अब ब्लॉक लिखता है और इसके विपरीत नहीं)
- -क्या आपका कोड गतिरोध के लिए अतिसंवेदनशील है या आपको लॉकिंग का अनुभव है? यदि आप लंबे ताले या बहुत सारे गतिरोधों का सामना नहीं कर रहे हैं, तो आशावादी लॉकिंग का अतिरिक्त ओवरहेड तेजी से चीजें नहीं करेगा, निश्चित रूप से, ज्यादातर मामलों में हम यहां मिलिसेकंड की बात कर रहे हैं।
- -यदि आपका डीबी बड़ा है (या बहुत सीमित हार्डवेयर पर) और आपके डेटा पेज पूर्ण हैं, तो आरडीबीएमएस के आधार पर, आप बड़े पृष्ठ विभाजन और डेटा विखंडन का कारण बन सकते हैं, इसलिए इसे चालू करने के बाद रीइन्डेक्सिंग पर विचार करना सुनिश्चित करें।
इस मामले पर मेरे विचार हैं, समुदाय से अधिक सुनवाई के लिए खुले हैं।