उपयोगकर्ता द्वारा संपादित किए जाने के दौरान क्या मुझे अपने क्लाउड DB में पंक्तियों को लॉक करना चाहिए


12

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

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

क्या यह ओवर राइटिंग डेटा को रोकने के लिए एक अच्छा तरीका होगा? क्या यह ओवरकिल है (मुझे उम्मीद नहीं है कि इस एप्लिकेशन का उपयोग एक ही खाते में कुछ से अधिक लोगों द्वारा समवर्ती रूप से किया जाएगा)।

(मेरे पास एक और चिंता 2 लोगों को एक ही आइटम के लिए लॉक मिलने की है, हालांकि मेरा मानना ​​है कि एक दौड़ की स्थिति है, जिसके साथ मैं सहज हूं।)


1
"मेरे पास एक और चिंता यह है कि 2 लोग एक ही आइटम के लिए लॉक प्राप्त कर रहे हैं, हालांकि मेरा मानना ​​है कि एक दौड़ की स्थिति है जिसके साथ मैं सहज हूं" - लॉक के अधिग्रहण के आसपास डेटाबेस लेनदेन का उपयोग करके ऐसी दौड़ की स्थितियों को रोकना चाहिए।
जूल्स

अधिकांश डेटाबेस इंजन (संबंधपरक प्रकार के, कम से कम) इसके लिए समर्थन में बनाए गए हैं। यह RDBMS की दुनिया में एक बहुत ही सामान्य अवधारणा है, और यहां तक ​​कि "टॉय" डेटाबेस भी इसे अच्छी तरह से संभालते हैं, यह देखते हुए कि आप इसे बताते हैं कि आप आशावादी या निराशावादी लॉकिंग चाहते हैं। वैसे भी, मुझे नहीं लगता कि यह कुछ ऐसा है जिसे आपको किसी भी तरह से अपने आप को बनाने की आवश्यकता है: अपने डीबी इंजन पर विकल्पों की जांच करें कि इसके साथ कैसे काम करें।
jleach

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

जवाबों:


19

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

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

आपके द्वारा दी गई योजना लॉक मूल्य के लिए आशावादी लॉकिंग को लागू करने से बहुत बेहतर होगी, लेकिन मेरा कूबड़ यह है कि आशावादी लॉकिंग पूरी बात के लिए ठीक है और आप is_locked फ़ील्ड से छुटकारा पा सकते हैं।

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

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


यह एक बहुत ही उपयोगी उत्तर है। क्या आप बता सकते हैं कि "टकराव" के एक छोटे से मौके के कारण निराशावादी तालाबंदी क्यों हतोत्साहित होती है। क्या यह विशुद्ध रूप से है क्योंकि इसे डेटाबेस में जाने के लिए भी संपादन शुरू करने की आवश्यकता है, या अतिरिक्त जटिलता या किसी अन्य कारण से? धन्यवाद!
२१:

3
@yitzih कुछ ने पढ़ने का सुझाव दिया: फाउलर एट अल, एंटरप्राइज एप्लीकेशन आर्किटेक्चर के पैटर्न । इस सवाल पर एक पूरा अध्याय है, जिसमें उन्हें चुनने के सभी विकल्पों और कारणों की अच्छी चर्चा है।
जूल्स

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

3
यह ध्यान देने योग्य है कि निराशावादी लॉकिंग क्लाइंट को समझाने में बहुत आसान है। यदि आप एक संदेश लिखते हैं कि ग्राहक रिकॉर्ड को एक्सेस नहीं कर सकता है क्योंकि यह वर्तमान में किसी अन्य द्वारा संपादित किया जा रहा है, तो क्लाइंट दोनों ही ठीक समझता है और आम तौर पर इसे स्वीकार करता है। यदि आप सहेजने के बाद क्लाइंट को बताते हैं कि बचत संभव नहीं थी, क्योंकि यह पहले से ही किसी अन्य उपयोगकर्ता, 7/10 द्वारा अपडेट किया गया था, तो ग्राहक इस अजीब कार्यक्रम व्यवहार के लिए निराश और / या स्पष्टीकरण की उम्मीद करेगा।
नील

2
@ नील यह सच है और मुझे लगता है कि आशावादी अधिक उपयुक्त होने पर अक्सर निराशावादी लॉकिंग का उपयोग किया जाता है। अक्सर वर्कफ़्लो यह बहुत संभावना नहीं बनाता है कि टकराव हो।
जिमीजैम

0

से @ JimmyJames का जवाब है, हम देख सकते हैं कि प्रश्न के बारे में वास्तव में है उपयोगकर्ता अनुभव

यह सब संदर्भ पर निर्भर करता है। किसी रिकॉर्ड को अपडेट करने में कितना समय और प्रयास लगता है? कई उपयोगकर्ता एक ही दस्तावेज़ को कितनी बार अपडेट करना चाहते हैं?

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

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

हालांकि, यदि आपके उपयोगकर्ता काफी समय या प्रयास करते हैं तो आपको अन्य तरीकों पर विचार करना चाहिए। क्या आपका रिकॉर्ड अच्छी तरह से संरचित है? क्या आप उपयोगकर्ताओं को सर्वर पर संस्करण और उनके द्वारा सहेजे जा रहे संस्करण के बीच तुलना (एक भिन्न) दिखा सकते हैं? क्या आप मतभेदों को उजागर कर सकते हैं? क्या आप उन्हें परिवर्तनों को मर्ज करने दे सकते हैं ? उस अनुभव के बारे में सोचें जो आप अपने स्रोत-नियंत्रण उपकरणों के साथ रखना चाहते हैं। आप वास्तव में उस सभी कोड को फिर से लिखने के लिए मजबूर नहीं होना चाहते हैं!

आप अतिरिक्त प्रेरणा के लिए Google डॉक्स को देख सकते हैं। शायद आप उपयोगकर्ताओं को एक सूचना दिखा सकते हैं कि एक नया संस्करण सहेजा गया है। हो सकता है कि आप उन्हें दिखा सकें कि कितने लोगों के पास रिकॉर्ड खुला है ताकि वे कम विवादास्पद समय पर वापस आ सकें।

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