डेटाबेस लेनदेन और लॉकिंग के बीच सटीक संबंध क्या है?


16

यह मेरा ज्ञान बढ़ाने की भावना से पूछा गया एक विनम्र प्रश्न है; कृपया अपनी प्रतिक्रिया में सौम्य रहें।

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

मुझे यह भी पता है कि (विभिन्न डेटाबेस में) एक लॉक क्या है, या कम से कम कैसे व्यवहार करता है (यदि मैं किसी तालिका को स्पष्ट रूप से लॉक करता हूं, तो कोई अन्य प्रक्रिया या थ्रेड उस तालिका के बारे में कुछ भी अपडेट नहीं कर सकता है)।

जो मैं सबसे स्पष्ट रूप से स्पष्ट नहीं हूं वह यह है: विभिन्न डेटाबेस में, जब मैं स्पष्ट रूप से एक पंक्ति या तालिका को लॉक करता हूं, तो क्या मैं सटीक उसी निर्माणों को नियोजित कर रहा हूं जो लेनदेन को ठीक से करने के लिए कवर के तहत डेटाबेस की लेनदेन सुविधाओं द्वारा उपयोग किया जाता है?

यही है, यह मेरे लिए होता है कि लेनदेन के लिए परमाणु और पृथक होने के लिए, यह कुछ लॉकिंग करना चाहिए। क्या यह लेन-देन-आरंभ, ट्रांसैसेशन-छिपी लॉकिंग एक ही तरह का लॉकिंग है जो विभिन्न डेटाबेस मुझे निर्माण जैसे कि SELECT FOR UPDATEस्पष्ट LOCKकमांड के माध्यम से एक्सेस करने देता है? या ये दोनों अवधारणाएं पूरी तरह से अलग हैं?

फिर, मैं इस प्रश्न के भोलेपन के लिए माफी माँगता हूँ; मुझे अधिक संस्थापक स्रोतों की ओर इशारा करते हुए खुशी हो रही है।

जवाबों:


12

जब मैं स्पष्ट रूप से एक पंक्ति या एक तालिका लॉक करता हूं, तो क्या मैं ठीक उसी तरह के निर्माणों को नियोजित कर रहा हूं, जो लेनदेन को ठीक से करने के लिए कवर के तहत डेटाबेस की लेनदेन सुविधाओं द्वारा उपयोग किए जाते हैं?

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

मेरे साथ ऐसा होता है कि लेनदेन के लिए परमाणु और अलग-थलग होना चाहिए, यह कुछ लॉकिंग करना चाहिए।

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

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


शायद आप इसके बारे में (कोई लॉकिंग) आशावादी
संगरोध

अहा! अब हम बात करेंगे। दरअसल, मेरे दिमाग में सबसे पीछे घूम रहा था MVCC । अच्छी तरह से व्यक्त जवाब, महान संदर्भ और वास्तव में मेरे प्रश्न में खुदाई करने के लिए समय निकालने के लिए धन्यवाद।
लेयर्ड नेल्सन

3

आपके सवालों के जवाब देने से पहले कुछ पृष्ठभूमि:

नोट: यह Microsoft SQL सर्वर से संबंधित है - RDBMS ........

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

अब वापस अपने प्रश्नों के लिए:

जब मैं स्पष्ट रूप से एक पंक्ति या एक तालिका लॉक करता हूं, तो क्या मैं ठीक उसी तरह के निर्माणों को नियोजित कर रहा हूं, जो लेनदेन को ठीक से करने के लिए कवर के तहत डेटाबेस की लेनदेन सुविधाओं द्वारा उपयोग किए जाते हैं?

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

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

क्या यह लेन-देन-आरंभ, लेनदेन-छिपी लॉकिंग उसी तरह का लॉकिंग है जो विभिन्न डेटाबेस मुझे निर्माणों जैसे कि SELECT FOR UPDATE या स्पष्ट LOCK कमांड के माध्यम से एक्सेस करने देता है?

Sql सर्वर में सब कुछ एक लेनदेन में निहित है। जब आप अपने डेटा को एक्सेस करते हैं, तो RDBMS को आइसोलेशन स्तर और आपके डेटा पर आपके द्वारा किए जा रहे ऑपरेशन के आधार पर ताले लेने पड़ते हैं। अधिक विवरण के लिए इस उत्तर को जांचें ।

कुछ अच्छे संदर्भ:


2

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

जब लेन-देन की बात आती है तो आप किसी भी RDMS से अधिक या कम सुसंगत व्यवहार की अपेक्षा कर सकते हैं जो SQL का समर्थन करने और लेनदेन का समर्थन करने का दावा करता है, लेकिन जब ताले की बात आती है, तो लगभग हर विक्रेता अलग-अलग रणनीति और शब्दावली का उपयोग करता है। जहाँ तक मैं बता सकता हूँ कि सभी RMDS में आम हिस्सा लेन-देन के बीच की संगति अलगाव स्तर द्वारा परिभाषित किया गया है, जबकि तालों के बीच संगामिति को लॉक प्रकार (साझा, अनन्य, आदि) द्वारा नियंत्रित किया जाता है।

संक्षेप में, वस्तुओं और संगति की स्थिरता को नियंत्रित करने के लिए ताले निम्न स्तर के तंत्र हैं। SQL कथन निष्पादन के दौरान ताले जारी किए जा सकते हैं। लेनदेन अलगाव स्तर के कार्यान्वयन पर निर्भर करता है, इंजन प्रभावित वस्तुओं (पंक्तियों, समूहों, अनुक्रमित, आदि) पर विभिन्न प्रकार के ताले लगा सकता है। मैन्युअल रूप से ताले ( SELECT FOR UPDATE, LOCK) जारी करने के लिए सीमित संख्या में कमांड उपलब्ध है । DML तालों को बढ़ाया जा सकता है (उदाहरण के लिए, RDMS पर निर्भर करता है, SQLServer row-> पेज-> पार्टीशन-> टेबल में)। कनेक्शन दीक्षा, बैकअप, पुनर्स्थापना, प्रक्रिया / ट्रिगर / फ़ंक्शन / आदि recompilation, स्टार्टअप, शटडाउन, आदि के दौरान डेटाबेस इंजन द्वारा ताले भी जारी किए जा सकते हैं।

मुझे यकीन नहीं है कि अगर आपके सवाल का जवाब है, लेकिन मुझे आशा है कि यह समझ में आता है।


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

जहाँ तक मुझे पता है, BEGIN TRANSACTIONअपने आप में कोई ताले नहीं जारी करता है। लेनदेन के भीतर डीएमएल के बाद ताले दिखाई देंगे।
a1ex07

स्पष्टता - मेरा मतलब BEGIN TRANSACTIONहै कि खुद डीएमएल ताले नहीं बनाते हैं; यह वास्तव में कुछ आंतरिक ताले जारी करना चाहिए क्योंकि इसमें संसाधनों को आवंटित करना है, सिस्टम टेबल में प्रवेश करना है [s] (यदि कोई है) जो सक्रिय लेनदेन रखता है, आदि
a1ex07

1

मैं SQL सर्वर शब्दजाल का उपयोग करूंगा, लेकिन अन्य विक्रेताओं के लिए अवधारणाएं समान होनी चाहिए:

आपके द्वारा निष्पादित प्रत्येक कमांड लेनदेन के अंदर निष्पादित की जाती है। वह लेनदेन डेटाबेस इंजन द्वारा स्पष्ट रूप से BEGIN TRAN के साथ खोला जा सकता है। निहित लेनदेन का कारण यह है कि इंजन को अभी भी एसीआईडी ​​अनुपालन और रोलबैक की क्षमता बनाए रखने की आवश्यकता है।

जब आप UPDATE के लिए सेलेक्ट करते हैं, तो इसका मतलब सिर्फ यह है कि जब लेन-देन होता है, तो यह एक निश्चित लॉक होगा।


आपकी टिप्पणी के लिये धन्यवाद। इतना मुझे पता है। लेकिन मेरा प्रश्न अभी भी है: जब वह लेन-देन खोला जाता है, तो क्या उसके अलगाव को उसके स्वयं के ताले लगाकर पूरा किया जाता है? यदि हां, तो क्या वे ताले उसी प्रकार के हैं जिन्हें मैं स्पष्ट रूप से प्राप्त कर सकता हूं? या लेनदेन अन्य साधनों के माध्यम से अलगाव प्राप्त करता है?
लैयर्ड नेल्सन

2
हां, यह वही तंत्र है। अलगाव दोनों मोड में ताले का उपयोग करके प्राप्त किया जाता है, वही ताले जो आप स्पष्ट रूप से प्राप्त कर सकते हैं। अंतर यह है कि यदि आप स्पष्ट रूप से लेन-देन नहीं खोलते हैं, तो कमांड समाप्त होने पर ताले जारी किए जाएंगे, जबकि एक स्पष्ट लेनदेन में ताले तब तक आयोजित किए जाते हैं जब तक आप प्रतिबद्ध नहीं होते हैं (अलगाव के स्तर के कारण 100% सटीक नहीं, लेकिन यह है कि सामान्य विचार)।
मटन युंगमैन

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

@LairdNelson जो SQL सर्वर के लिए स्नैपशॉट अलगाव स्तर है । मौजूदा, लेकिन संक्षिप्तता के लिए डिफ़ॉल्ट तंत्र नहीं। यह Oracle या Postgresql के लिए डिफ़ॉल्ट है, हालांकि, IIRC।
मरिअन २

0

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

यह सब ACID के बारे में है: - इसे पढ़ें और यह आपके दिमाग को साफ कर देगा! ACID उन संपत्तियों का समूह है, जिन्हें आप किसी डेटाबेस को संशोधित करते समय लागू करना चाहते हैं।

  • ** Atomicity
  • संगति
  • अलगाव
  • स्थायित्व **

लेन-देन संबंधित परिवर्तनों का एक समूह है जिसका उपयोग ACID के कुछ गुणों को प्राप्त करने के लिए किया जाता है। लेनदेन ACID गुण प्राप्त करने के लिए उपकरण हैं।

एटमॉसिटी का अर्थ है कि आप गारंटी दे सकते हैं कि सभी लेन-देन होता है, या इसमें से कोई भी नहीं करता है; आप एक ही इकाई, सभी या कुछ भी नहीं के रूप में जटिल संचालन कर सकते हैं, और एक दुर्घटना, बिजली की विफलता, त्रुटि, या कुछ और आपको ऐसी स्थिति में नहीं रहने देगा जिसमें केवल कुछ संबंधित परिवर्तन हुए हैं।

संगति का अर्थ है कि आप गारंटी देते हैं कि आपका डेटा सुसंगत होगा; संबंधित डेटा पर आपके पास कोई भी बाधा कभी भी उल्लंघन नहीं होगी।

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

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

इसलिए, इन संपत्तियों की गारंटी के लिए लेनदेन एक तंत्र है; वे संबंधित क्रियाओं को एक साथ समूहित करने का एक तरीका है जैसे कि एक पूरे के रूप में, संचालन का एक समूह परमाणु हो सकता है, लगातार परिणाम उत्पन्न कर सकता है, अन्य कार्यों से अलग हो सकता है, और टिकाऊ रूप से रिकॉर्ड किया जा सकता है।


आपके कमेंट के लिए धन्यवाद। मुझे ACID के गुणों के बारे में कम से कम जानकारी है। मैं अभी भी स्पष्ट नहीं हूं: क्या लेनदेन उसी प्रकार के ताले का उपयोग करके एसीआईडी ​​को लागू करते हैं जो मैं स्पष्ट LOCKविवरणों के माध्यम से सीधे उपयोग कर सकता हूं , या क्या वे किसी अन्य तंत्र का उपयोग करके करते हैं?
लैरीड नेल्सन

डेटाबेस कई हस्तांतरण अलगाव स्तर प्रदान करते हैं, जो डेटा का चयन करते समय होने वाली लॉकिंग की डिग्री को नियंत्रित करते हैं।
उप_ एक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.