निराशावादी लॉकिंग निराशावादी लॉकिंग से क्यों तेज है?


9

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

लेकिन दोनों एक दूसरी प्रक्रिया को लटका देते हैं। इसलिए मैं पूछता हूं: आशावादी लॉकिंग को आमतौर पर निराशावादी लॉकिंग की तुलना में अधिक तेज / श्रेष्ठ क्यों माना जाता है? और, क्या ऐसे मामले हैं जहां आशावादी पर निराशावादी पसंद किया जाता है? अग्रिम में धन्यवाद!


5
नामकरण में एक बहुत ही संक्षिप्त व्याख्या मौजूद है। एक परस्पर विरोधी लॉक की संभावना कम होने पर आशावादी लॉकिंग अच्छी तरह से काम करती है। हम कई प्रक्रियाओं की बातचीत के बारे में आशावादी हैं। निराशावादी लॉकिंग अच्छी तरह से काम करता है जब एक परस्पर विरोधी लॉक की संभावना अधिक होती है। हम कई प्रक्रियाओं की बातचीत के बारे में निराशावादी हैं। दोनों उप-आशावादी प्रदर्शन करेंगे जहां उनका विपरीत अधिक उपयुक्त होगा।
मार्क स्टोरी-स्मिथ

आशावादी लॉकिंग आपके कार्यभार के आधार पर निराशावादी लॉकिंग से तेज हो सकती है या नहीं भी हो सकती है।
एके

जवाबों:


8

इससे डुप्लिकेट प्रश्न:

/programming/129329/optimistic-vs-pessimistic-locking

उपरोक्त लिंक से उत्तर कॉपी / पेस्ट करना:

आशावादी लॉकिंग एक रणनीति है जहां आप एक रिकॉर्ड पढ़ते हैं, एक संस्करण संख्या पर ध्यान दें और जांच करें कि रिकॉर्ड वापस लिखने से पहले संस्करण बदल नहीं गया है। जब आप रिकॉर्ड वापस लिखते हैं तो आप संस्करण पर अद्यतन फ़िल्टर करते हैं यह सुनिश्चित करने के लिए कि यह परमाणु है। (यानी जब आप संस्करण की जाँच करें और डिस्क पर रिकॉर्ड लिखें) के बीच अद्यतन नहीं किया गया है और संस्करण को एक हिट में अपडेट करें।

यदि रिकॉर्ड गंदा है (यानी आपके लिए अलग संस्करण) तो आप लेनदेन को रोक देते हैं और उपयोगकर्ता इसे फिर से शुरू कर सकता है।

यह रणनीति उच्च-वॉल्यूम सिस्टम और त्रि-स्तरीय आर्किटेक्चर पर लागू होती है, जहाँ आप जरूरी नहीं कि अपने सत्र के लिए डेटाबेस से संबंध बनाए रखें। इस स्थिति में क्लाइंट वास्तव में डेटाबेस लॉक को बनाए नहीं रख सकता क्योंकि कनेक्शन एक पूल से लिए गए हैं और आप एक ही कनेक्शन से अगले तक एक ही कनेक्शन का उपयोग नहीं कर रहे हैं।

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

बाद के मामले में आप TxID के साथ लेनदेन को खोलते हैं और फिर उस आईडी का उपयोग करके पुन: कनेक्ट करते हैं। DBMS ताले को बनाए रखता है और आपको सत्र को TxID के माध्यम से वापस लेने की अनुमति देता है। यह दो-चरण प्रतिबद्ध प्रोटोकॉल (जैसे XA या COM + लेनदेन) का उपयोग करके लेनदेन कैसे वितरित किया जाता है।

संपादित करें (प्रदर्शन प्रश्न को संबोधित करने के लिए और जानकारी जोड़ना):

प्रदर्शन बुद्धिमान यह आपके पर्यावरण पर निर्भर करता है। निर्णय लेने के लिए निम्नलिखित कारकों में लें:

आप आशावादी खोजने जा रहे हैं ज्यादातर स्थितियों में संगामिति के कारण बेहतर होगा। RDBMS और पर्यावरण के आधार पर यह कम या अधिक प्रदर्शनकारी हो सकता है। आमतौर पर आशावादी लॉकिंग के साथ आप पाएंगे कि मूल्य को कहीं न कहीं पंक्तिबद्ध करने की आवश्यकता है।

उदाहरण के लिए MS SQL Server के साथ, यह TempDB में स्थानांतरित हो जाता है और कॉलम के अंत में 12-14 बाइट्स के बीच कुछ जोड़ा जाता है। स्नैपशॉट अलगाव के रूप में एक अलगाव स्तर के साथ आशावादी लॉकिंग को चालू करने से विखंडन हो सकता है और आपके भरण कारक को समायोजित करने की आवश्यकता होगी क्योंकि अब पंक्तियों में अंत में अतिरिक्त डेटा होता है जो पृष्ठ विभाजन का कारण बनने के लिए पूर्ण पृष्ठ के पास हो सकता है, जो कम होगा आपका प्रदर्शन। यदि आपका TempDB अनुकूलित है, तो यह उतना तेज़ नहीं होगा।

इसलिए मुझे लगता है कि एक चेकलिस्ट है:

  • -क्या आपके पास पंक्ति संस्करण के रूप को संभालने के लिए पर्याप्त IO / संसाधन हैं? यदि नहीं, तो आप ओवरहेड जोड़ रहे हैं। यदि ऐसा है, तो यदि आप डेटा को अक्सर पढ़ रहे हैं, जबकि आप इसे लिखने के लिए अक्सर लॉक कर रहे हैं, तो आप पठन और लेखन के दौरान संगामिति पर एक अच्छा सुधार देखेंगे (हालांकि लिखता है फिर भी लिखता है, पढ़ता है अब ब्लॉक लिखता है और इसके विपरीत नहीं)
  • -क्या आपका कोड गतिरोध के लिए अतिसंवेदनशील है या आपको लॉकिंग का अनुभव है? यदि आप लंबे ताले या बहुत सारे गतिरोधों का सामना नहीं कर रहे हैं, तो आशावादी लॉकिंग का अतिरिक्त ओवरहेड तेजी से चीजें नहीं करेगा, निश्चित रूप से, ज्यादातर मामलों में हम यहां मिलिसेकंड की बात कर रहे हैं।
  • -यदि आपका डीबी बड़ा है (या बहुत सीमित हार्डवेयर पर) और आपके डेटा पेज पूर्ण हैं, तो आरडीबीएमएस के आधार पर, आप बड़े पृष्ठ विभाजन और डेटा विखंडन का कारण बन सकते हैं, इसलिए इसे चालू करने के बाद रीइन्डेक्सिंग पर विचार करना सुनिश्चित करें।

इस मामले पर मेरे विचार हैं, समुदाय से अधिक सुनवाई के लिए खुले हैं।


धन्यवाद @Ali Razeghi (+1) - मुझे लगता है कि dba.se इस प्रश्न के लिए अधिक उपयुक्त स्थान है। इसके अलावा, हालांकि यह एक शानदार जवाब है, यह मेरे प्रदर्शन के सवाल का जवाब नहीं देता है (जब एक दूसरे से तेज होता है)। एक बार फिर धन्यवाद!
मारा

हाय मारा, यह एक अच्छी बात है। मैंने उत्तर का विस्तार किया है। धन्यवाद।
अली रज़ेगी 20

11

आप आशावादी लॉकिंग को गलत समझते हैं।

आशावादी लॉकिंग एक दूसरे के लिए प्रतीक्षा करने के लिए लेनदेन का कारण नहीं बनता है।

आशावादी लॉकिंग संभवतः लेनदेन को विफल करने का कारण बनता है, लेकिन ऐसा बिना किसी "लॉक" के कभी भी किया जाता है। और यदि आशावादी लॉकिंग के कारण कोई लेनदेन विफल हो जाता है, तो उपयोगकर्ता को फिर से शुरू करना आवश्यक है। शब्द "आशावादी" बिल्कुल इस उम्मीद से उत्पन्न होता है कि इस स्थिति के कारण लेनदेन विफल होने का कारण बनता है, केवल असाधारण रूप से होगा। "आशावादी" लॉकिंग वह दृष्टिकोण है जो कहता है "मैं वास्तविक ताले नहीं ले जाऊंगा क्योंकि मुझे आशा है कि उन्हें वैसे भी ज़रूरत नहीं होगी। अगर यह पता चला कि मैं इसके बारे में गलत था, तो मैं अपरिहार्य विफलता को स्वीकार करूंगा।"


1

आशावादी लॉकिंग आम तौर पर तेज़ है क्योंकि वास्तव में डेटाबेस बिंदु से कोई लॉकिंग नहीं है। यह पूरी तरह से आवेदन पर निर्भर है कि संस्करण कॉलम (या छद्म स्तंभ, जैसे ora_rowscn) का सम्मान करना है या नहीं। आम तौर पर आपके पास एक ही डेटाबेस से जुड़े कई एप्लिकेशन होते हैं, इसलिए db साझा संसाधन बन जाता है, और यदि यह लटका रहता है, तो सभी क्लाइंट प्रभावित होंगे।

आशावादी लॉकिंग रणनीति के साथ, 'हैंगिंग' क्लाइंट की तरफ होता है और दूसरों को प्रभावित नहीं करता है।

हालांकि, यदि कोई रिकॉर्ड बार-बार अपडेट किया जाता है, तो आप इसे कई बार (आशावादी लॉकिंग के मामले में) फिर से पढ़ना शुरू कर सकते हैं, इस प्रकार आशावादी रणनीति के सबसे लाभों को हरा सकते हैं।

मैं किसी भी दृष्टिकोण की श्रेष्ठता के बारे में सहमत नहीं हूँ; दोनों का दुरुपयोग हो सकता है। निराशावादी अधिक त्रुटि-प्रवण है, क्योंकि यह अधिक खतरनाक है: डीबी स्तर पर लॉकिंग होता है, आरडीएमएस पर निर्भर करता है कि आपके पास लॉक (लॉक एस्केलेशन) पर नियंत्रण नहीं हो सकता है, आपको मैन्युअल रूप से लॉकिंग ऑर्डर की देखभाल करने की आवश्यकता है।


दिलचस्प बिंदु a1ex07, ऑप्टिमसिटिक लॉकिंग में अभी भी लॉकिंग शामिल है, क्योंकि राइट हमेशा अन्य राइट्स को ब्लॉक करेगा, सही?
अली रज़ेगी

नहीं, यह नहीं है। इसलिए यह "तेज" है।
इरविन स्मौट

यह Oracle के लिए, लेकिन MS SQL सर्वर के लिए मामला हो सकता है, क्योंकि यह डिफ़ॉल्ट रूप से 'रीड कमिटेड' आइसोलेशन स्तर का उपयोग करता है, आशावादी लॉकिंग पाठकों और लेखक थ्रेड्स को समवर्ती रूप से काम करने की अनुमति देगा, लेकिन ब्लॉक ब्लॉकिंग थ्रेड्स शुरू होने तक लिखता है।
अली रज़ेगी

@ अल रज़ीगी: मुझे यकीन नहीं है कि मैं आपकी बात का पालन करूंगा। जब तक `READ_COMMITTED_SNAPSHOT` चालू न हो, तब तक पढ़ने वाले प्रतिबद्ध लेखकों के साथ SQLServer में डिफ़ॉल्ट रूप से ब्लॉक करें। आशावादी लॉकिंग डीबी संसाधन (पंक्ति / पृष्ठ / तालिका) पर लॉक नहीं है, बल्कि सभी अनुप्रयोगों के बीच किसी प्रकार का समझौता है जो डेटाबेस का उपयोग रिकॉर्ड को अपडेट करने के लिए नहीं करता है यदि संस्करण अपेक्षित मेल नहीं खाता है।
a1ex07

1
@ ईमोन नेरबोन: मैंने 'लेखकों को पाठकों को ब्लॉक नहीं करने' के बारे में कहा ... आपने कहां देखा कि मैंने "लेखकों के ब्लॉक / लेखकों को ब्लॉक नहीं करने" के बारे में कुछ भी उल्लेख किया है? "
a1ex07

0

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

निराशावादी लॉकिंग मानता है कि समवर्ती लेनदेन एक-दूसरे के साथ संघर्ष करेंगे, इसलिए इसे लॉक की आवश्यकता है, यह लेनदेन प्रबंधन के स्तर को निर्दिष्ट करके किया जाता है (लेन-देन प्रबंधन के अनधिकृत, पढ़ें प्रतिबद्ध, बार-बार पढ़ने और अनुक्रमिक) को पढ़ें। यह लॉक प्राप्त करके समसामयिक समस्याओं को हल करता है। साझा संसाधनों या वस्तुओं (टेबल्स, डेटा पंक्तियों, डेटा ब्लॉक, कैश्ड आइटम, कनेक्शन और संपूर्ण सिस्टम) की सुरक्षा के लिए ताले सेवा करते हैं। हमारे पास साझा ताले, अपडेट लॉक, इनसेट लॉक, अनन्य ताले, लेनदेन ताले, डीएमएल ताले, स्कीमा ताले और बैकअप-रिकवरी लॉक के रूप में कई प्रकार के ताले हैं।

अधिक विचार प्राप्त करने के लिए


-3

यह कहना गलत है कि निराशावादी लॉकिंग आशावादी होने के बजाय धीमी है या यह कहना कि आशावादी तेजी है। इस क्लासिक तरीके को प्रदर्शित करने के लिए एक क्लासिक क्वेरी विभिन्न RDBMS पर एक समुच्चय है, जैसे:

SELECT COUNT(*) FROM atable

आप देखेंगे कि, RDBMS में, मूल रूप से आशावादी दृष्टिकोण का समर्थन करते हैं, इस क्वेरी के हिसाब से समय बहुत अधिक महत्वपूर्ण है, जिनके पास मूल रूप से निराशावादी ताला है

उदाहरण के लिए मेरे पीसी पर, एक ही क्वेरी SQL सर्वर पर 27 ms और PostGreSQL पर 109 ...

अतिरिक्त ओवरहेड MVCC पंक्तियों के मृत संस्करणों को पढ़ने में आवश्यक है और कुल में भूत रिकॉर्ड की गणना नहीं करता है जो निराशावादी does'nt है एक अतिरिक्त लागत जोड़ता है!


4
DBMS संगामिति नियंत्रण दृष्टिकोण आशावादी / निराशावादी लॉकिंग के लिए रूढ़िवादी है, और दो अलग-अलग DBMSes में क्वेरी रन बार की तुलना भ्रामक है।
17'17

चूँकि SQL सर्वर दो लॉकिंग मोड्स को करने में सक्षम है, इसलिए आप आसानी से यूजर कॉन्सेप्ट एप्रोच में एक असली becnhmark कर इसकी तुलना कर सकते हैं।
user7370003
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.