अवरोध क्या है और यह कैसे होता है?


20

मैंने एसक्यूएल सर्वर में ब्लॉक करने के बारे में कुछ जानकारी खोजने की कोशिश की, लेकिन मुझे पता नहीं है कि यह क्या है और यह कैसे होता है। क्या आप मुझे बता सकते हैं?

जवाबों:


23

उपमा

कभी-कभी यह कंप्यूटरों से दूर एनालॉग्स का उपयोग करने में मदद करता है।

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

दूसरा बच्चा उस संसाधन से अवरुद्ध है।

यदि हम इसकी तुलना टीवी से करते हैं, उदाहरण के लिए, कई बच्चे किसी एक बिंदु पर टीवी देख सकते हैं।

ताले

यदि हम डेटाबेस की दुनिया में आगे बढ़ते हैं, तो हम देखते हैं कि संसाधनों का उपयोग करने के अलग-अलग तरीके हैं (ठीक ऊपर हमारे दो उदाहरणों की तरह)। हम "रीड" कर सकते हैं या हम "राइट" कर सकते हैं।

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

यह सुनिश्चित करने के लिए कि ये गंदे पढ़े नहीं जाते, हमारे पास दो प्राथमिक प्रकार के ताले हैं, रीड लॉक्स और अनन्य ताले।

ताला पढ़ें

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

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

अनन्य ताला

यदि कोई कनेक्शन डेटा का एक टुकड़ा अद्यतन / सम्मिलित / हटाना चाहता है, तो उन्हें एक विशेष लॉक निकालना होगा। यह किसी अन्य कनेक्शन को डेटा पर लॉक को हटाने से रोकता है (लॉक को उस कनेक्शन के लिए अनन्य बनाता है)।

जब कनेक्शन में डेटा पर अनन्य लॉक होता है, तो डेटा से कोई अन्य कनेक्शन नहीं पढ़ सकता है। यह गंदे रीड को रोकने में मदद करता है ताकि यह लिखा जा सके कि कोई भी डेटा को पढ़ नहीं सकता है।

ब्लॉक कर रहा है

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

इस मामले की तुलना एक गेंद को पकड़े हुए बच्चे से करें। गेंद को पकड़ने वाला बच्चा अन्य सभी बच्चों को गेंद को पकड़ने से रोक रहा है।

गतिरोध

मुझे पता है कि आपने यह नहीं पूछा, लेकिन गतिरोधों के लिए यह केवल एक और कदम है (और यह सीधे अवरुद्ध होने से संबंधित है)।

डेडलॉक तब हो सकता है जब आपके पास दो कनेक्शन हों जिनमें से प्रत्येक में एक लॉक हो, लेकिन वे एक दूसरे को संसाधन चाहते हैं। इस परिदृश्य में, यह दो बच्चों की तरह है कि प्रत्येक के पास एक गेंद है, लेकिन दूसरे की गेंद चाहते हैं।

बच्चों की तरह, ये कनेक्शन साझा करने के इच्छुक नहीं हैं। प्रत्येक कनेक्शन को जारी रखने के लिए दोनों संसाधनों तक पहुंच की आवश्यकता होती है। हालांकि, वे स्थायी रूप से अवरुद्ध होने की स्थिति में हैं। इस स्थिति में, माता-पिता (DBMS) को एक हारने वाले को चुनना पड़ता है ताकि बच्चों में से किसी एक (कनेक्शन) के पास दोनों संसाधनों तक पहुंच हो सके।

एक बार जब "जीत" कनेक्शन किया जाता है, तो यह संसाधनों को जारी करता है और फिर अन्य ("हार") कनेक्शन दोनों संसाधनों को प्राप्त करने के लिए फिर से कोशिश कर सकता है।

इसलिए, गतिरोध की अवधारणा वह है जहां आपके पास दो संसाधन हैं जो एक दूसरे को रोक रहे हैं।


यहां , आप सभी विभिन्न प्रकार के तालों के बारे में पढ़ सकते हैं जिनमें एसक्यूएल सर्वर की पेशकश और विभिन्न संसाधन हैं जो अवरुद्ध / गतिरोध पैदा कर सकते हैं। लेख पुराना है, लेकिन यह अभी भी 2008 R2 के माध्यम से SQL Server 2000 के लिए लागू होता है। (SQL सर्वर के बाद के संस्करणों में कुछ और प्रकार के ताले जोड़े गए हैं, लेकिन यह आपको एक प्रारंभिक बिंदु देगा।)


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

2
SQL सर्वर के लिए, यह स्वचालित रूप से किया जाता है (बशर्ते डेटाबेस गतिरोध का पता लगा सके )। उदाहरण के लिए, इसका पता लगाने में परेशानी हो सकती है, यह वास्तव में एक लाइव लॉक है
रिचर्ड

उत्कृष्ट और बहुत गहन जवाब रिचर्ड। लाइव ताले पर एक अतिरिक्त बिंदु (जिसकी वास्तव में तुलना नहीं की जानी चाहिए या गतिरोध से संबंधित है, इसका सीधा सादा पुराना अवरोधन) ... एसक्यूएल आगे ताले को ले जाने से रोकेगा जहां एक विशेष लॉक का इंतजार किया जा रहा है, 4 क्रमिक ओवरलैपिंग साझा ताले के बाद IIRC।
मार्क स्टोरी-स्मिथ

5

रिचर्ड द्वारा महान विवरण, लेकिन सिर्फ आधिकारिक प्रलेखन के लिंक जोड़ना चाहते थे। ये विषय SQL Server 2000 के लिए लिखे गए थे, लेकिन अधिकांश अवधारणाएं आज भी समान हैं:

ब्लॉकिंग को समझना और उससे बचना

SQL सर्वर में लॉकिंग को समझना

संपादित करें - कुछ अतिरिक्त:

सभी 3 बहुत अच्छी तरह से ज्ञात SQL सर्वर लेखक और / या MVP हैं।

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