2.1 अप्रतिबद्ध पढ़ें

"लेन-देन अलगाव स्तर" डीबीएमएस के आंतरिक तंत्र द्वारा प्रदान की गई सुरक्षा की डिग्री को संदर्भित करता है (अर्थात, विशेष प्रोग्रामिंग की आवश्यकता नहीं है) लेनदेन के समानांतर निष्पादन के दौरान होने वाली सभी या कुछ प्रकार की डेटा विसंगतियों से। SQL-92 मानक चार अलगाव स्तरों के पैमाने को परिभाषित करता है:

  • अप्रतिबद्ध पढ़ें
  • प्रतिबद्ध पढ़ें
  • दोहराने योग्य पढ़ा
  • serializable

उनमें से पहला सबसे कमजोर है, आखिरी सबसे मजबूत है, प्रत्येक बाद वाले में पिछले सभी शामिल हैं।

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

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

2.2 प्रतिबद्ध पढ़ें

अधिकांश औद्योगिक DBMS, विशेष रूप से Microsoft SQL सर्वर, PostgreSQL और Oracle, डिफ़ॉल्ट रूप से इस स्तर का उपयोग करते हैं। इस स्तर पर, ड्राफ्ट, "डर्टी" रीडिंग से सुरक्षा प्रदान की जाती है, हालाँकि, एक लेनदेन के संचालन के दौरान, दूसरे को सफलतापूर्वक पूरा किया जा सकता है और इसके द्वारा किए गए परिवर्तन ठीक हो जाते हैं। नतीजतन, पहला लेनदेन एक अलग डेटा सेट के साथ काम करेगा।

पूर्ण पठन का कार्यान्वयन दो दृष्टिकोणों में से एक पर आधारित हो सकता है: अवरुद्ध करना या संस्करण बनाना।

पठनीय और परिवर्तनशील डेटा को ब्लॉक करना।

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

समानांतर में बदलने वाली पंक्तियों के एकाधिक संस्करणों को सहेजना।

हर बार जब कोई पंक्ति बदली जाती है, तो DBMS इस पंक्ति का एक नया संस्करण बनाता है, जिसके साथ डेटा को बदलने वाला लेन-देन काम करना जारी रखता है, जबकि कोई अन्य "रीडिंग" लेनदेन अंतिम प्रतिबद्ध संस्करण लौटाता है। इस दृष्टिकोण का लाभ यह है कि यह तेज़ है क्योंकि यह अवरुद्ध होने से रोकता है। हालाँकि, इसके लिए पहले वाले की तुलना में, RAM की काफी अधिक खपत की आवश्यकता होती है, जो पंक्ति संस्करणों के भंडारण पर खर्च की जाती है।

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

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

2.3 बार-बार पढ़ने योग्य

जिस स्तर पर एक पठन लेनदेन "नहीं देखता है" उस डेटा में परिवर्तन करता है जिसे उसने पहले पढ़ा था। उसी समय, कोई अन्य लेन-देन वर्तमान लेन-देन द्वारा पढ़े गए डेटा को समाप्त होने तक नहीं बदल सकता है।

लेन-देन में किसी भी निर्देश द्वारा पढ़े गए सभी डेटा पर साझा मोड में ताले लगाए जाते हैं और लेन-देन पूरा होने तक रोके जाते हैं। यह अन्य लेन-देन को लंबित लेन-देन द्वारा पढ़ी गई पंक्तियों को संशोधित करने से रोकता है। हालाँकि, अन्य लेन-देन नई पंक्तियाँ सम्मिलित कर सकते हैं जो वर्तमान लेनदेन में निहित निर्देशों के लिए खोज स्थितियों से मेल खाती हैं। जब मौजूदा लेन-देन द्वारा बयान को फिर से शुरू किया जाता है, तो नई पंक्तियां प्राप्त की जाएंगी, जिसके परिणामस्वरूप एक प्रेत पढ़ा जाएगा।

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

2.4 सीरियल करने योग्य

अलगाव का उच्चतम स्तर; लेन-देन एक-दूसरे से पूरी तरह से अलग-थलग हैं, हर एक को ऐसे निष्पादित किया जाता है जैसे कि कोई समानांतर लेनदेन नहीं था। यह केवल इस स्तर पर है कि समवर्ती लेन-देन "फैंटम रीड" प्रभाव के अधीन नहीं हैं।

2.5 वास्तविक DBMS में लेन-देन अलगाव के लिए समर्थन

लेन-देन संबंधी डीबीएमएस हमेशा सभी चार स्तरों का समर्थन नहीं करते हैं, और अतिरिक्त भी पेश कर सकते हैं। इन्सुलेशन प्रदान करने में भी विभिन्न बारीकियाँ हैं।

इसलिए, सिद्धांत रूप में, ओरेकल शून्य स्तर का समर्थन नहीं करता है, क्योंकि लेनदेन के कार्यान्वयन में "गंदे पढ़ने" को शामिल नहीं किया गया है, और औपचारिक रूप से दोहराने योग्य पढ़ने के स्तर को सेट करने की अनुमति नहीं देता है, यानी यह केवल (डिफ़ॉल्ट रूप से) और का समर्थन करता Read committedहै Serializable। साथ ही, अलग-अलग आदेशों के स्तर पर, यह वास्तव में पढ़ने की दोहराने योग्यता की गारंटी देता है (यदि SELECTपहले लेनदेन में एक आदेश डेटाबेस से पंक्तियों का एक सेट चुनता है, और इस समय समानांतर दूसरा लेनदेन इन पंक्तियों में से कुछ को बदलता है, तो पहले लेन-देन द्वारा प्राप्त परिणाम सेट में अपरिवर्तित पंक्तियाँ होंगी, जैसे कि कोई दूसरा लेन-देन नहीं था)। ओरेकल तथाकथित लेन- READ-ONLYदेन का भी समर्थन करता है, जो इसके अनुरूप है Serializable, लेकिन डेटा को स्वयं नहीं बदल सकता है।

और Microsoft SQL सर्वर सभी चार मानक लेन-देन अलगाव स्तरों का समर्थन करता है, और इसके अलावा, स्नैपशॉट स्तर, जिस पर लेन-देन उस डेटा स्थिति को देखता है जो लॉन्च होने से पहले प्रतिबद्ध थी, साथ ही साथ स्वयं द्वारा किए गए परिवर्तन, अर्थात यह व्यवहार करता है यदि यह स्टार्टअप पर प्राप्त होता है, तो DB डेटा का एक स्नैपशॉट और इसके साथ काम करता है। सीरियलाइज़्ड से अंतर यह है कि किसी भी ताले का उपयोग नहीं किया जाता है, लेकिन परिणामस्वरूप, परिवर्तन करना संभव नहीं हो सकता है यदि एक समवर्ती लेनदेन ने पहले उसी डेटा को बदल दिया हो; इस मामले में, दूसरा लेन-देन, निष्पादित करने का प्रयास करते समय, COMMITएक त्रुटि संदेश देगा और रद्द कर दिया जाएगा।