क्या आशावादी आशावादी वस्तु प्रति वस्तु Serializability होती है यदि कोई लेन-देन कई वस्तुओं को कभी नहीं करेगा?


13

एक प्रणाली है जो प्रदान करती है:

  • ऑप्टीमेटिक कंसिस्टेंसी कंट्रोल / वर्जन प्रति ऑब्जेक्ट (कैस - चेक-एंड-सेट का उपयोग करके)
  • ऐसे लेन-देन जिनमें कभी भी अधिक वस्तु की जरूरत नहीं होती है।
  • स्नैपशॉट अलगाव

क्या इस प्रणाली को अनुक्रमिक माना जाता है ?

से स्नैपशॉट अलगाव

राइट तिरछी विसंगति में, दो लेन-देन (T1 और T2) समवर्ती डेटा सेट (जैसे मान V1 और V2) को पढ़ते हैं, समवर्ती रूप से असंबद्ध अपडेट करते हैं (जैसे T1 अपडेट V1, T2 अपडेट V2), और अंत में समवर्ती रूप से प्रतिबद्ध हैं, न तो देखा जा रहा है। दूसरे द्वारा किया गया अद्यतन। सिस्टम क्रमिक थे, इस तरह की विसंगति असंभव होगी, क्योंकि टी 1 या टी 2 में "पहले" होना होगा, और दूसरे को दिखाई देगा। इसके विपरीत, स्नैपशॉट आइसोलेशन स्केव विसंगतियों को लिखने की अनुमति देता है।

एक ठोस उदाहरण के रूप में, कल्पना करें कि V1 और V2 एक ही व्यक्ति फिल द्वारा रखे गए दो संतुलन हैं। बैंक या तो वी 1 या वी 2 को घाटे को चलाने की अनुमति देगा, बशर्ते दोनों में आयोजित कुल कभी भी नकारात्मक न हो (यानी वी 1 + वी 2 V 0)। दोनों संतुलन वर्तमान में $ 100 हैं। फिल समवर्ती रूप से दो लेनदेन शुरू करता है, T1 V1 से $ 200 निकाल रहा है, और T2 V2 से $ 200 वापस ले रहा है।

इसके आधार पर ऐसा लगता है कि राइट तिरछा लिखने की क्षमता एक प्रणाली का एकमात्र कारण है जो कि स्नैपशॉट अलगाव की गारंटी देता है, सीरियल योग्य नहीं है।

हालाँकि, एक प्रणाली में जो कई वस्तुओं (ऊपर के उदाहरण V1 और V2 में) को लेन-देन करने की अनुमति नहीं देता है, यह लिखने के लिए तिरछा घटित होना असंभव लगता है।

इसलिए, ऊपर वर्णित प्रणाली क्रमबद्ध है। क्या ये सही है?


1
मुझे लगता है कि उत्तर हां है, इस प्रोविज़ो के साथ कि डेटाबेस को लेनदेन को निरस्त करने की अनुमति है जो अन्यथा लिखने में तिरछा परिचय देगा - यदि लेनदेन एक ही वस्तु को पढ़ने / लिखने तक सीमित हैं, तो या तो वे असंतुष्ट हैं या टकरा रहे हैं।
pjc50

2
मुझे लगता है कि प्रारंभिक प्रतिबद्ध के लिए डुप्लिकेट रिकॉर्ड को रोकने के लिए भी आपको किसी तरह की आवश्यकता होगी। इस मामले में, दो आशावादी लेखक प्रत्येक को एक खाली स्नैपशॉट देख सकते हैं और यह रिकॉर्ड नया था और इस प्रकार आपके पास दो ऑब्जेक्ट हो सकते हैं, प्रत्येक संस्करण में 0.
मैथ्यू मार्क मिलर

जवाबों:


1

नहीं, मुझे नहीं लगता है कि आपके वजीफे का नतीजा एक ऐसी प्रणाली के रूप में है जिसे हमें क्रमबद्धता पर विचार करना चाहिए।

स्नैपशॉट अलगाव एक ऐसी तकनीक है जो सुनिश्चित करती है कि एक लेनदेन पूरे लेनदेन में एक ही डेटासेट देखता है। स्नैपशॉट अलगाव कुछ गारंटी प्रदान करता है, लेकिन यह समझने के लिए कि लेनदेन वास्तव में कैसे काम करते हैं, यह समझने के लिए आवश्यक सभी विशेषताओं को परिभाषित नहीं करता है (जब तक कि हम स्नैपशॉट अलगाव और MVCC को चुनना नहीं चाहते हैं)।

स्नैपचैट अलगाव को आमतौर पर MVCC, मल्टी वर्जन कंसिस्टेंसी कंट्रोल का उपयोग करके लागू किया जाता है। MVCC अपने स्नैपशॉट के संदर्भ में लेन-देन के अधिक विवरण को परिभाषित करता है: यह कहता है कि उन्हें केवल अलगाव की आवश्यकता होती है जब संघर्ष लिखते हैं (केवल स्थान, या कार्यान्वयन के आधार पर स्थान + मान)। MVCC एक सुसंगत स्थिरता मॉडल प्रदान करता है, और लेखन तिरछा से ग्रस्त है।

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

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

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

हमें केवल लेनदेन द्वारा पढ़े या लिखे गए सटीक आंकड़ों पर विचार करने की आवश्यकता है, उस सेट के बाहर के किसी भी डेटा पर विचार नहीं किया जाना चाहिए। हालांकि, यह महसूस करना महत्वपूर्ण है कि जब हम किसी लेनदेन द्वारा पढ़े जाने वाले डेटा के बारे में बात कर रहे हैं, तो हमें आवश्यक रूप से कोई भी और सभी "मेटा" डेटा (और डेटा और मेटाडेटा जैसे मेटा ऑपरेशंस जैसे बाधाओं की जाँच) द्वारा पढ़ा जाना चाहिए। मेटा डेटा के उदाहरण हैं / मेटा ऑपरेशन हैं: एक अद्वितीय नई प्राथमिक कुंजी की पहचान; एक और पूरे स्तंभ का योग है; एक और चीज खोजना है और उसे नहीं पाना है; रेंज खोज या रकम। यह डुप्लिकेट को रोकने के बारे में @ मैथ्यू की टिप्पणी के साथ-साथ @Tersosauros के उत्तर पर जाता है, जिसमें वह राज्य मानता है।

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

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

आराम से संगति संभावित असंगत, या त्रुटि प्रवण कहने का एक और तरीका है। (रिलैक्स्ड कंसिस्टेंसी को अंततः सुसंगतता के साथ भ्रमित नहीं किया जाना चाहिए, जो "NoSQL" से उत्पन्न त्रुटि का एक और अलग लोकप्रिय रूप है।)

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

तथापि...

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

आपका प्रश्न लिखने से मुझे पता चलता है कि "ऑब्जेक्ट" में एक से अधिक फ़ील्ड हैं, अन्यथा प्रश्न की वसीयत अनावश्यक होगी।

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

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

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

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


0

मुझे लगता है, जैसा कि @ pjc50 ने कहा, (जोर ने कहा :) " अगर लेन-देन किसी एक वस्तु को पढ़ने / लिखने तक सीमित है" तो "उत्तर हां है"। हालांकि, मुझे लगता है कि जहां यह गिरता है वह एक ही वस्तु के विचार में है ।

स्नैपशॉट अलगाव से लिए गए उदाहरण में , T1 और T2 किसी भी मूल्य को साझा नहीं करते हैं। हालाँकि, वे अभी भी राइट राइट के लिए संभावित हैं क्योंकि " न तो [] ने दूसरे " स्रोत द्वारा किए गए अपडेट को देखा है । इसलिए यह लेन-देन करने की क्षमता है जो अन्य सभी अद्यतनों को देखने से पहले करता है जो लेनदेन को वास्तव में अनुक्रमिक बनाता है।

से serializability :

किसी शेड्यूल की क्रमिकता का अर्थ है एक ही लेन-देन के साथ एक सीरियल शेड्यूल (यानी, समय में बिना किसी लेन-देन के ओवरलैप के साथ अनुक्रमिक) में समतुल्यता (परिणाम, डेटाबेस स्थिति, डेटा मान)।

दुर्भाग्यवश, इस वजह से (और @Matthew मार्क मिलर बताते हैं), हमें राज्य के साथ-साथ मूल्यों पर भी विचार करना चाहिए । इस विचार से, जब भी कोई डेटाबेस स्थिति लिखी जाती है, तो OCC का उपयोग करने वाले दो लेन-देन में तिरछा लिखने की क्षमता होगी ।

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