1.1 परिचय
और अब मज़ा शुरू होता है - लेन-देन कैसे काम करता है इसका सिद्धांत। जब आप एक ही डेटा को अलग-अलग थ्रेड्स में बदलते हैं तो सिस्टम को कैसे काम करना है? या क्या आप एक लेनदेन को दूसरे में निष्पादित करना चाहते हैं? हम लेन-देन के अलगाव का अध्ययन करके इन सवालों के जवाब तलाशना शुरू करेंगे ...
लेन-देन अलगाव स्तर एक सशर्त मूल्य है जो यह निर्धारित करता है कि DBMS में तार्किक रूप से समानांतर लेनदेन के निष्पादन के परिणामस्वरूप असंगत डेटा की अनुमति किस हद तक है। लेन-देन अलगाव स्तरों के पैमाने में कई मान होते हैं, जिन्हें निम्नतम से उच्चतम तक रैंक किया जाता है; एक उच्च अलगाव स्तर बेहतर डेटा स्थिरता से मेल खाता है, लेकिन इसका उपयोग शारीरिक समानांतर लेनदेन की संख्या को कम कर सकता है।
इसके विपरीत, कम अलगाव स्तर अधिक समानांतर लेनदेन की अनुमति देता है, लेकिन डेटा सटीकता को कम करता है। इस प्रकार, उपयोग किए गए लेन-देन अलगाव के स्तर को चुनना, सूचना प्रणाली के विकासकर्ता, एक निश्चित सीमा तक, काम की गति और सिस्टम से प्राप्त डेटा की गारंटीकृत स्थिरता सुनिश्चित करने के बीच एक विकल्प प्रदान करता है।
लेनदेन का उपयोग कर समवर्ती पहुंच की समस्याएं
जब लेन-देन समानांतर में निष्पादित किए जाते हैं, तो निम्नलिखित समस्याएं संभव हैं:
- खोया हुआ अपडेट - यदि एक डेटा ब्लॉक को अलग-अलग लेन-देन द्वारा एक साथ बदल दिया जाता है, तो पिछले एक को छोड़कर सभी परिवर्तन खो जाते हैं;
- "डर्टी" रीडिंग (इंग्लैंड। डर्टी रीड) - लेन-देन द्वारा जोड़ा या बदला गया डेटा पढ़ना, जो बाद में पुष्टि नहीं की जाएगी (वापस लुढ़का);
- नॉन-रिपीटेबल रीड (इंग्लैंड। नॉन-रिपीटेबल रीड) - जब एक ही ट्रांजेक्शन के भीतर फिर से पढ़ा जाता है, तो पहले पढ़ा गया डेटा बदल जाता है;
- प्रेत पढ़ता है - इसके निष्पादन के दौरान एक लेनदेन कई बार एक ही मानदंड के अनुसार कई पंक्तियों का चयन करता है। इन फ़ेच के बीच एक और लेन-देन पंक्तियों को जोड़ता है या पहले लेन-देन के फ़ेच मानदंड में उपयोग की गई कुछ पंक्तियों के कॉलम को संशोधित करता है और सफलतापूर्वक समाप्त होता है। नतीजतन, यह पता चलेगा कि पहले लेनदेन में समान चयन पंक्तियों के विभिन्न सेट देते हैं।
उन स्थितियों पर विचार करें जिनमें ये समस्याएं हो सकती हैं।
1.2 खोया अद्यतन
वह स्थिति जब एक डेटा ब्लॉक को अलग-अलग लेन-देन द्वारा एक साथ बदला जाता है, तो परिवर्तनों में से एक खो जाता है।
मान लीजिए कि एक ही समय में दो लेनदेन चल रहे हैं:
लेन-देन 1 | लेन-देन 2 |
---|---|
अद्यतन tbl1 सेट f2=f2+20 जहां f1=1; | अद्यतन tbl1 सेट f2=f2+25 जहां f1=1; |
दोनों लेन-देन में, f2 फ़ील्ड का मान बदल जाता है; पूरा होने पर, फ़ील्ड का मान 45 से बढ़ाया जाना चाहिए। वास्तव में, क्रियाओं का निम्नलिखित क्रम हो सकता है:
- दोनों लेन-देन एक साथ क्षेत्र की वर्तमान स्थिति को पढ़ते हैं। यहां सटीक भौतिक संगामिति की आवश्यकता नहीं है, यह पर्याप्त है कि दूसरे लेन-देन के परिणाम लिखने से पहले दूसरा रीड ऑपरेशन पूरा हो जाए।
- दोनों लेन-देन पहले पढ़े गए मान में क्रमशः 20 और 25 जोड़कर नए फ़ील्ड मान की गणना करते हैं।
- लेन-देन परिकलन के परिणाम को फ़ील्ड f2 पर वापस लिखने का प्रयास करते हैं। चूँकि एक ही समय में दो राइट्स करना शारीरिक रूप से असंभव है, वास्तव में एक राइटिंग ऑपरेशन पहले किया जाएगा, दूसरा बाद में। दूसरा राइट ऑपरेशन पहले वाले के परिणाम को ओवरराइट कर देगा।
नतीजतन, दोनों लेन-देन के पूरा होने पर f2 फ़ील्ड का मान 45 से नहीं, बल्कि 20 या 25 तक बढ़ सकता है, यानी डेटा बदलने वाले लेनदेन में से एक "गायब" हो जाएगा।
1.3 "गंदा" पढ़ना
लेन-देन द्वारा जोड़े गए या संशोधित किए गए डेटा को पढ़ना जो बाद में कमिट (रोलबैक) करने में विफल हो जाएगा।
मान लीजिए कि हमारे पास विभिन्न अनुप्रयोगों द्वारा खोले गए दो लेनदेन हैं जो निम्नलिखित SQL कथनों को निष्पादित करते हैं:
लेन-देन 1 | लेन-देन 2 |
---|---|
अद्यतन tbl1 सेट f2=f2+1 जहां f1=1; | |
tbl1 से f2 का चयन करें जहां f1=1; | |
रोलबैक कार्य; |
लेन-देन 1 में, फ़ील्ड f2 का मान बदल दिया गया है, और फिर लेन-देन 2 में, इस फ़ील्ड का मान चुना गया है। उसके बाद, लेन-देन 1 को वापस ले लिया जाता है। नतीजतन, दूसरे लेनदेन द्वारा प्राप्त मूल्य डेटाबेस में संग्रहीत मूल्य से भिन्न होगा।
1.4 गैर-दोहराने योग्य पढ़ना
वह स्थिति जब एक ही लेन-देन के भीतर फिर से पढ़ने पर, पहले पढ़ा गया डेटा बदल जाता है।
मान लीजिए कि हमारे पास विभिन्न अनुप्रयोगों द्वारा खोले गए दो लेनदेन हैं जो निम्नलिखित SQL कथनों को निष्पादित करते हैं:
लेन-देन 1 | लेन-देन 2 |
---|---|
tbl1 से f2 का चयन करें जहां f1=1; | |
अद्यतन tbl1 सेट f2=f2+3 जहां f1=1; | |
वादा करना; | |
tbl1 से f2 का चयन करें जहां f1=1; |
लेन-देन 2 में, फ़ील्ड f2 का मान चुना जाता है, फिर लेन-देन 1 में, फ़ील्ड f2 का मान बदल दिया जाता है। यदि आप लेन-देन 2 में फ़ील्ड f2 से मान का चयन करने के लिए फिर से प्रयास करते हैं, तो एक अलग परिणाम प्राप्त होगा। यह स्थिति विशेष रूप से अस्वीकार्य है जब डेटा को आंशिक रूप से संशोधित करने और डेटाबेस में वापस लिखने के लिए पढ़ा जाता है।
1.5 "प्रेत" पढ़ना
स्थिति जब एक ही लेन-देन के भीतर बार-बार पढ़ने के दौरान, एक ही चयन पंक्तियों के अलग-अलग सेट देता है।
मान लीजिए कि विभिन्न अनुप्रयोगों द्वारा दो लेनदेन खोले गए हैं जो निम्नलिखित SQL कथनों को निष्पादित करते हैं:
लेन-देन 1 | लेन-देन 2 |
---|---|
tbl1 से SUM (f2) चुनें; | |
tbl1 (f1, f2) मान (15,20) में डालें; | |
वादा करना; | |
tbl1 से SUM (f2) चुनें; |
लेन-देन 2 एक SQL कथन निष्पादित करता है जो f2 फ़ील्ड के सभी मानों का उपयोग करता है। फिर लेन-देन 1 में एक नई पंक्ति डाली जाती है, जिससे लेन-देन 2 में SQL कथन का पुन: निष्पादन एक अलग परिणाम उत्पन्न करता है। इस स्थिति को फैंटम रीडिंग (प्रेत पढ़ना) कहा जाता है। यह गैर-दोहराने योग्य पढ़ने से अलग है जिसमें बार-बार डेटा एक्सेस का नतीजा डेटा के परिवर्तन/हटाने के कारण नहीं, बल्कि नए (प्रेत) डेटा की उपस्थिति के कारण बदल गया है।
GO TO FULL VERSION