आशावादी बनाम निराशावादी ताला


571

मैं आशावादी और निराशावादी लॉकिंग के बीच के अंतर को समझता हूं। अब कोई मुझे समझा सकता है कि मैं सामान्य रूप से एक का उपयोग कब करूंगा?

और क्या इस सवाल का जवाब इस बात पर निर्भर करता है कि मैं क्वेरी करने के लिए संग्रहीत प्रक्रिया का उपयोग कर रहा हूं या नहीं?

लेकिन सिर्फ जांचने के लिए, आशावादी का अर्थ है "पढ़ने के दौरान तालिका को लॉक न करें" और निराशावादी का अर्थ है "पढ़ने के दौरान तालिका को लॉक करें।"



1
यह एक अच्छा सवाल है क्योंकि विशेष रूप से क्रमबद्धता में मैंने पढ़ा है At any technique type conflicts should be detected and considered, with similar overhead for both materialized and non-materialized conflicts
लिटिल एलियन

1
यहां आप एक अच्छा स्पष्टीकरण पा सकते हैं, यहां SO पर, ऑप्टिमिस्टिक लॉकिंग की मूल अवधारणा क्या है ।
डिएगो माज़ारो

जवाबों:


812

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

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

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

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

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


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

2
@geek - एक्सए जैसे वितरित लेनदेन प्रोटोकॉल एक अलग लेन-देन पहचानकर्ता को एक या अधिक प्रणालियों के आसपास जालीदार होने की अनुमति देते हैं। इस प्रकार के प्रोटोकॉल से पूल को कनेक्शन के माध्यम से उपयोग करने की अनुमति मिलती है क्योंकि लेनदेन पहचानकर्ता सत्र से डी-कपल होता है और स्पष्ट रूप से आपूर्ति की जाती है। हालांकि, यह कुछ ओवरहेड को उकसाता है और यदि आपके आवेदन के बारे में जानकारी नहीं है तो लीक ताले और लेन-देन पहचानकर्ताओं के लिए खतरा है। यह बहुत अधिक हैवीवेट समाधान है।
कंसर्नडऑफटुनब्रिजवल्स

22
@ सुपरकैट - इस बात से सहमत नहीं हैं कि आशावादी लॉकिंग 100% से कम सटीक है - जब तक यह लेन-देन के लिए सभी इनपुट रिकॉर्ड की जांच करता है जो कि अवधि के लिए अनमॉडिफाइड रहना चाहिए, यह निराशावादी लॉकिंग के रूप में सटीक है (उन पर अद्यतन शैली के लिए चयन करें) एक ही रिकॉर्ड। मुख्य अंतर यह है कि आशावादी लॉकिंग ओवरहेड तभी होता है जब कोई संघर्ष होता है, जबकि निराशावादी लॉकिंग ने संघर्ष पर ओवरहेड को कम कर दिया है। इसलिए आशावादी उस मामले में सबसे अच्छा है जहां अधिकांश लेनदेन संघर्ष नहीं करते हैं - जो मुझे आशा है कि आमतौर पर अधिकांश ऐप्स के लिए मामला है।
रिचवेल

2
@Legends - ऑप्टिमसिटिक लॉकिंग का उपयोग करना निश्चित रूप से एक वेब अनुप्रयोग के लिए एक उपयुक्त रणनीति होगी।
कंसर्नडऑफटुनब्रिजवेल्स

2
आपको यह उल्लेख करना चाहिए कि पसंद बनाम लिखने वाले अनुपात पर भी निर्भर करती है: यदि आपका आवेदन मुख्य रूप से बहुत से उपयोगकर्ताओं द्वारा केवल-पढ़ने के लिए किया गया आवेदन है, और कभी-कभी आप आशावादी लॉकिंग के लिए जाने की तुलना में डेटा लिखते हैं। StackOverflow, उदाहरण के लिए, पृष्ठों को पढ़ने वाले बहुत से लोग होते हैं, और कभी-कभी कोई एक को संपादित करता है: निराशावादी लॉकिंग में, ताला किसे मिलेगा? पहले वाला? आशावादी लॉकिंग में, वह व्यक्ति जो पृष्ठ को संपादित करना चाहता है, वह तब तक कर सकता है जब तक उसके पास इसका अंतिम संस्करण है।
जेहोन

177

आशावादी लॉकिंग का उपयोग तब किया जाता है जब आप कई टकरावों की उम्मीद नहीं करते हैं। एक सामान्य ऑपरेशन करने के लिए कम खर्च होता है लेकिन यदि टकराव होता है तो आप इसे हल करने के लिए उच्च मूल्य का भुगतान करेंगे क्योंकि लेनदेन समाप्त हो गया है।

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

उचित ताला तंत्र चयन करने के लिए आप उसके अनुसार राशि का रीड और राईट और योजना का अनुमान लगाने के लिए है।


सामान्य स्थिति में, कथन एकदम सही है, लेकिन विशेष मामलों में जहां आप जवाब में उल्लिखित @skaffman के रूप में अशुद्धि की अनुमति देकर कैस ऑपरेशन का प्रबंधन कर सकते हैं , मैं कहूंगा कि वास्तव में निर्भर करता है।
19

75

आशावादी मानता है कि आप इसे पढ़ते समय कुछ भी नहीं बदलने जा रहे हैं।

निराशावादी मानता है कि कुछ होगा और इसलिए इसे बंद कर देता है।

यदि यह आवश्यक नहीं है कि डेटा पूरी तरह से पढ़ा गया हो तो आशावादी उपयोग करें। आपको अजीब 'गंदा' पढ़ने को मिल सकता है - लेकिन यह गतिरोध और इस तरह के परिणाम की संभावना कम है।

अधिकांश वेब एप्लिकेशन गंदे रीड्स के साथ ठीक हैं - दुर्लभ अवसर पर डेटा वास्तव में अगली रील लोड नहीं करता है।

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

पेज लॉकिंग के लिए ओह, और Microsoft SQL सर्वर डिफ़ॉल्ट रूप से - मूल रूप से पंक्ति आप कर रहे हैं पढ़ने और कुछ दोनों ओर। रो लॉकिंग अधिक सटीक है लेकिन बहुत धीमी है। पढ़ने के दौरान गतिरोध से बचने के लिए अक्सर अपने लेन-देन को पढ़ने के लिए प्रतिबद्ध या बिना लॉक के लायक है।


जेपीए आशावादी लॉकिंग आपको रीड-संगति की गारंटी देता है।
गिली

4
रीड-कंसिस्टेंसी एक अलग चिंता का विषय है - PostgreSQL, ओरेकल और कई अन्य डेटाबेस के साथ, आपको किसी भी अपडेट की परवाह किए बिना डेटा का एक सुसंगत दृश्य मिलता है, जो अभी तक प्रतिबद्ध नहीं है, और अनन्य पंक्ति ताले से भी प्रभावित नहीं होते हैं।
रिचवेल 13

मुझे @RichVel से सहमत होना होगा। एक तरफ, मैं देख सकता हूं कि अगर आपके लेनदेन के अलगाव का स्तर READ UNCOMMITTED है तो निराशावादी लॉकिंग गंदे रीड्स को कैसे रोक सकता है। लेकिन यह कहना भ्रामक है कि आशावादी लॉकिंग गंदे रीड्स के लिए अतिसंवेदनशील है, बिना यह उल्लेख किए कि अधिकांश डेटाबेस (जाहिरा तौर पर एमएस SQL ​​सर्वर सहित) "READ COMMITTED" का डिफ़ॉल्ट आइसोलेशन स्तर है, जो गंदे रीड को रोकता है और आशावादी लॉकिंग को सटीक रूप से सटीक बनाता है। निराशावादी।
एंटीऑनोम ant

एरिक ब्राउनर का कहना है कि बैंकर, दूसरों के विपरीत, गंदे संचालन पसंद करते हैं। आपके गुरु ट्रॉलियों से बिल्कुल बाहर लगते हैं।
छोटे एलियन

1
एरिक ब्रेवर वह गुरु हैं जिन्होंने कैप प्रमेय दिया जो बैंकिंग में स्थिरता के बारे में कहते हैं । यह आपके लिए इसका सम्मान करने के विपरीत है।
छोटी एलियन

50

इसके अलावा जो पहले ही कहा जा चुका है:

  • यह कहा जाना चाहिए कि optimisticलॉकिंग भविष्यवाणी की कीमत पर संगामिति में सुधार करता है।
  • Pessimisticलॉकिंग संगामिति को कम करता है, लेकिन अधिक अनुमानित है। आप अपने पैसे, आदि का भुगतान ...

3
मैं यह नहीं देखता कि कैसे पूर्वानुमान (हालांकि आप इसे परिभाषित करते हैं) को निराशावादी लॉकिंग के साथ सुधार किया जाता है - यदि आपका मतलब है कि 'लेन-देन के सही होने पर लेन-देन पूरा हो सकता है, लेकिन जब तक लेन-देन में सभी आवश्यक ताले नहीं होते, तब तक इसे प्राप्त करने में देरी का सामना करना पड़ सकता है। शेष ताले, और वास्तव में डीबी के गतिरोध का पता लगाने + संकल्प तर्क के कारण गर्भपात हो सकता है। निराशावादी लॉकिंग का उपयोग करने वाले ऐप्स में अप्रत्याशित निष्पादन समय हो सकता है - क्लासिक उदाहरण यह है कि कोई व्यक्ति रिकॉर्ड X को लॉक करता है, फिर दोपहर के भोजन के लिए जाता है, फिर एक उपयोगकर्ता X और Y रिकॉर्ड करता है, फिर एक और Y और Z, और इसी तरह जब तक कि अधिकांश उपयोगकर्ता अवरुद्ध नहीं हो जाते। ..
रिचवेल

40

संघर्षों से निपटने के लिए, आपके पास दो विकल्प हैं:

  • आप संघर्ष से बचने की कोशिश कर सकते हैं, और यही निराशावादी लॉकिंग करता है।
  • या, आप संघर्ष को घटित करने की अनुमति दे सकते हैं, लेकिन आपको अपने लेनदेन करने पर इसका पता लगाने की आवश्यकता है, और यही वह है जो ऑप्टिमिस्टिक लॉकिंग करता है।

अब, आइए निम्नलिखित लॉस्ट अपडेट विसंगति पर विचार करें :

अद्यतन खोया

लॉस्ट अपडेट विसंगति पढ़े हुए आइसोलेशन स्तर में हो सकती है ।

ऊपर दिए गए चित्र में हम देख सकते हैं कि ऐलिस का मानना ​​है कि वह उससे 40 वापस ले सकती है accountलेकिन उसे इस बात का अहसास नहीं है कि बॉब ने खाता शेष राशि को बदल दिया है, और अब इस खाते में केवल 20 शेष हैं।

निराशावादी लॉकिंग

निराशावादी ताला खाते पर साझा या पढ़ा ताला लगाकर इस लक्ष्य को प्राप्त करता है इसलिए बॉब को खाता बदलने से रोका जाता है।

अपडेटेड निराशावादी लॉकिंग खो दिया है

ऊपर दिए गए आरेख में, दोनों ऐलिस और बॉब accountटेबल पंक्ति पर एक रीड लॉक प्राप्त करेंगे जो दोनों उपयोगकर्ताओं ने पढ़ा है। डेटाबेस रिपीटेबल रीड या सीरीएबल का उपयोग करते समय SQL सर्वर पर इन तालों को प्राप्त करता है।

क्योंकि एलिस और बॉब दोनों accountने पीके मान के साथ पढ़ा है 1, उनमें से कोई भी इसे तब तक नहीं बदल सकता है जब तक कि एक उपयोगकर्ता रीड लॉक जारी नहीं करता है। ऐसा इसलिए है क्योंकि एक लिखने के ऑपरेशन के लिए राइट / एक्सक्लूसिव लॉक एक्विजिशन की जरूरत होती है, और शेयर / रीड लॉक को राइट / एक्सक्लूसिव लॉक को रोकना होता है।

जब एलिस ने अपना लेन-देन कर लिया और उसके बाद ही रीड लॉक को accountपंक्ति में छोड़ा गया , तो बॉब UPDATEफिर से शुरू करेगा और बदलाव को लागू करेगा। जब तक ऐलिस रीड लॉक जारी नहीं करता, तब तक बॉब के अद्यतन ब्लॉक।

डेटा एक्सेस फ्रेमवर्क अंतर्निहित डेटाबेस निराशावादी लॉकिंग समर्थन का उपयोग करने के तरीके के बारे में अधिक विवरण के लिए, इस लेख को देखें

आशावादी ताला

आशावादी लॉकिंग संघर्ष को उत्पन्न करने की अनुमति देता है, लेकिन संस्करण के बदलते ही ऐलिस के अद्यतन को लागू करने पर इसका पता लगाता है।

अनुप्रयोग स्तर के लेन-देन

इस बार, हमारे पास एक अतिरिक्त versionकॉलम है। versionस्तंभ हर बार एक अद्यतन वृद्धि की जाती है या DELETE निष्पादित किया जाता है, और यह भी कहां अद्यतन करने और हटाने के बयानों के खंड में प्रयोग किया जाता है। इसे काम करने के लिए, हमें चयन जारी करने और वर्तमान versionअद्यतन करने से पहले अद्यतन करने की आवश्यकता है, अन्यथा, हमें नहीं पता होगा कि WHERE क्लॉज या वेतन वृद्धि के लिए कौन सा संस्करण मान पास करना है।

डेटा एक्सेस फ्रेमवर्क आशावादी लॉकिंग को कैसे लागू करते हैं, इस बारे में अधिक जानकारी के लिए, इस लेख को देखें

अनुप्रयोग स्तर के लेन-देन

70 के दशक के शुरुआती 80 के दशक में रिलेशनल डेटाबेस सिस्टम उभरे हैं, जब एक क्लाइंट, आम तौर पर, टर्मिनल के माध्यम से मेनफ्रेम से कनेक्ट होता है। इसलिए हम अभी भी डेटाबेस सिस्टम को SESSION सेटिंग जैसे शब्दों को परिभाषित करते देखते हैं।

आजकल, इंटरनेट पर, हम अब एक ही डेटाबेस लेनदेन के संदर्भ में पढ़ते और लिखते हैं, और ACID अब पर्याप्त नहीं है।

उदाहरण के लिए, निम्नलिखित उपयोग के मामले पर विचार करें:

यहाँ छवि विवरण दर्ज करें

आशावादी लॉकिंग के बिना, कोई रास्ता नहीं है यह लॉस्ट अपडेट पकड़ा गया होता, भले ही डेटाबेस लेनदेन Serializable का उपयोग करता हो। ऐसा इसलिए है क्योंकि रीड और राइट को अलग-अलग HTTP अनुरोधों में निष्पादित किया जाता है, इसलिए विभिन्न डेटाबेस लेनदेन पर।

तो, आशावादी लॉकिंग आपको एप्लिकेशन-स्तरीय लेनदेन का उपयोग करते समय भी लॉस्ट अपडेट को रोकने में मदद कर सकता है जो उपयोगकर्ता-सोचने के समय को भी शामिल करता है।

आवेदन-स्तर या तार्किक लेनदेन के बारे में अधिक जानकारी के लिए, इस लेख को देखें

निष्कर्ष

आशावादी लॉकिंग एक बहुत ही उपयोगी तकनीक है, और यह कम-सख्त आइसोलेशन स्तरों का उपयोग करते समय भी ठीक काम करता है, जैसे Read Committed, या जब पढ़ता और लिखता है तो बाद के डेटाबेस लेनदेन में निष्पादित होते हैं।

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

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

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


आप किस परिदृश्य के लिए ऑप्टिमिस्टिकलॉकिंग और PessimisticLocking चुनने का सुझाव देंगे? क्या यह इस पर निर्भर करता है कि कितनी बार एक OptimisticLockException होती है?
स्टिम्पसन कैट

1
यह उपयोग के मामले पर निर्भर करता है। कभी-कभी, आशावादी लॉकिंग एकमात्र समाधान है (उदाहरण के लिए, बहु-अनुरोध लेनदेन)। अन्य समय में, निराशावादी लॉकिंग एकमात्र समाधान है (उदाहरण के लिए, पोस्टग्रेजिक एडवाइजरी लॉक )। कभी-कभी, आपको उन्हें संयोजित करना होगा, जैसे कि यह मामला है PESSIMISTIC_FORCE_INCREMENT
व्लाद मिहालसी 10

22

मैं एक और मामले के बारे में सोचूंगा जब निराशावादी ताला लगाना एक बेहतर विकल्प होगा।

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


आशावादी और निराशावादी लॉकिंग का उपयोग करने का प्रयास करने वाले लोग एक-दूसरे के पैरों पर भी कदम रख सकते हैं, इसलिए बोलने के लिए। एक परिदृश्य की कल्पना करें जहां एक आशावादी सत्र रिकॉर्ड पढ़ता है और कुछ गणना कर रहा है जबकि निराशावादी सत्र रिकॉर्ड को अपडेट करता है, तो आशावादी सत्र वापस आता है और बिना किसी बदलाव के उसी रिकॉर्ड को अपडेट करता है। चयन करें ... अद्यतन के लिए केवल तभी काम करता है जब प्रत्येक सत्र उसी वाक्यविन्यास का उपयोग कर रहा हो।
lusional

अच्छा स्पष्टीकरण, आप मुझे वोट दें
दुलज कुलथुंगा

15

मूल रूप से दो सबसे लोकप्रिय उत्तर हैं। पहले एक मूल रूप से कहते हैं

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

एक और जवाब है

आशावादी (वर्जनिंग) बिना किसी लॉकिंग के कारण तेज है लेकिन (निराशावादी) लॉकिंग बेहतर है जब विवाद अधिक होता है और काम को रोकने के बजाय इसे रोकना और शुरू करना बेहतर होता है।

या

जब आपके पास दुर्लभ टकराव होते हैं तो आशावादी लॉकिंग सबसे अच्छा काम करता है

जैसा कि इस पेज पर डाला गया है।

मैंने अपना जवाब यह बताने के लिए बनाया कि "कनेक्शन कैसे रखें" "कम टकराव" से संबंधित है।

यह समझने के लिए कि आपके लिए कौन सी रणनीति सबसे अच्छी है, सोचें कि लेन-देन प्रति सेकंड आपके डीबी के पास नहीं है, लेकिन एकल लेनदेन की अवधि है। आम तौर पर, आप ट्रैसनेशन, परफॉर्म ऑपरेशन खोलते हैं और लेनदेन बंद करते हैं। यह एक छोटा, शास्त्रीय लेनदेन है जो एएनएसआई के दिमाग में था और लॉकिंग से दूर होने के लिए ठीक था। लेकिन, आप एक टिकट आरक्षण प्रणाली कैसे लागू करते हैं जहां कई ग्राहक एक ही समय में एक ही कमरे / सीटें आरक्षित करते हैं?

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

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

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

मैं यह समझने से बहुत दूर हूं कि MVCC को मैन्युअल रूप से कैसे लागू किया जाए लेकिन मुझे लगता है कि पुनरारंभ के विकल्प के साथ लंबे समय तक चलने वाला लेनदेन विषय को समझने की कुंजी है। अगर मैं कहीं भी गलत हूं तो मुझे सुधारो। मेरा उत्तर इस एलेक्स कुज़नेकोव अध्याय से प्रेरित था ।


12

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

  • निराशावादी लॉकिंग उपयोगी है यदि एक ही समय में बहुत सारे अपडेट और उपयोगकर्ताओं की अपेक्षाकृत उच्च संभावना डेटा को अपडेट करने की कोशिश कर रहे हैं। उदाहरण के लिए, यदि प्रत्येक ऑपरेशन एक समय में बड़ी संख्या में रिकॉर्ड अपडेट कर सकता है (बैंक प्रत्येक माह के अंत में प्रत्येक खाते में ब्याज आय जोड़ सकता है), और दो आवेदन एक ही समय में इस तरह के संचालन चला रहे हैं, तो उनके पास संघर्ष होंगे ।

  • उन अनुप्रयोगों में निराशावादी लॉकिंग भी अधिक उपयुक्त है जिनमें छोटे टेबल होते हैं जिन्हें अक्सर अपडेट किया जाता है। इन तथाकथित हॉटस्पॉट्स के मामले में, टकराव इतने संभावित हैं कि आशावादी लॉकिंग संघर्षों को वापस करने के लिए संघर्ष को बर्बाद करने का प्रयास करते हैं।

  • आशावादी लॉकिंग उपयोगी है यदि संघर्षों की संभावना बहुत कम है - कई रिकॉर्ड हैं लेकिन अपेक्षाकृत कुछ उपयोगकर्ता हैं, या बहुत कम अपडेट और ज्यादातर रीड-टाइप ऑपरेशन हैं।


3

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

सबसे अच्छा उदाहरण मैं सोच सकता हूं कि एक डेटाबेस का उपयोग करके कार्यान्वित एक कार्य कतार के लिए है, जिसमें कई सूत्र समवर्ती कार्यों का दावा करते हैं। यदि किसी कार्य की स्थिति 'उपलब्ध', 'दावा की गई', 'पूर्ण' है, तो एक db क्वेरी "सेट स्थिति = 'दावा किया गया' जैसा कुछ कह सकती है जहाँ स्थिति = 'उपलब्ध' है। यदि कई सूत्र इस तरह से स्थिति बदलने का प्रयास करते हैं। सभी लेकिन गंदा डेटा के कारण पहला धागा विफल हो जाएगा।

ध्यान दें कि यह एक उपयोग मामला है जिसमें केवल आशावादी लॉकिंग शामिल है। तो यह कहने के विकल्प के रूप में "आशावादी लॉकिंग का उपयोग तब किया जाता है जब आप कई टकरावों की उम्मीद नहीं करते हैं", यह भी इस्तेमाल किया जा सकता है जहां आप टकराव की उम्मीद करते हैं लेकिन सफल होने के लिए बिल्कुल एक लेन-देन चाहते हैं।


3

आशावादी और निराशावादी लॉकिंग के बारे में बहुत सारी अच्छी बातें कही गई हैं। विचार करने के लिए एक महत्वपूर्ण बिंदु इस प्रकार है:

आशावादी लॉकिंग का उपयोग करते समय, हमें इस तथ्य से सावधान रहने की आवश्यकता है कि आवेदन इन विफलताओं से कैसे उबरेंगे।

विशेष रूप से अतुल्यकालिक संदेश संचालित आर्किटेक्चर में, यह ऑर्डर मैसेज प्रोसेसिंग या लॉस्ट अपडेट से बाहर निकल सकता है।

विफल परिदृश्यों के माध्यम से सोचा जाना चाहिए।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.