संगामिति का वर्णन करें
बहुउपयोगकर्ता डेटाबेस की एक मुख्य विशेषता संगामिति है। संगामिति लॉकिंग और ब्लॉकिंग का उपयोग करता है ताकि डेटा को एक ही समय में अपडेट करने और पढ़ने वाले कई उपयोगकर्ताओं के अनुरूप रहने में सक्षम बनाया जा सके। उदाहरण के लिए, शिपिंग लागत के कारण, हमारे सभी उत्पादों की कीमत में $ 5 की वृद्धि हुई है। वहीं, करेंसी रेट की वजह से सभी प्रॉडक्ट्स की कीमत में 3% की कमी होती है। यदि ये अपडेट ठीक उसी समय होते हैं, तो अंतिम मूल्य परिवर्तनशील होगा और कई त्रुटियां होने की संभावना है। लॉकिंग का उपयोग करके, आप यह सुनिश्चित कर सकते हैं कि एक अपडेट शुरू होने से पहले पूरा हो जाएगा।
संगामिति लेन-देन के स्तर पर होती है। एक लेखन लेनदेन अन्य लेनदेन को उसी डेटा को अपडेट करने और यहां तक कि पढ़ने से रोक सकता है। समान रूप से, एक पढ़ने का लेन-देन अन्य पाठकों या यहां तक कि कुछ लेखकों को भी अवरुद्ध कर सकता है। इस कारण से, अनावश्यक रूप से लंबे लेनदेन या अत्यधिक मात्रा में डेटा वाले लेनदेन से बचना महत्वपूर्ण है।
कई विशिष्ट लेनदेन अलगाव स्तर हैं जिनका उपयोग यह परिभाषित करने के लिए किया जा सकता है कि डेटाबेस सिस्टम कई उपयोगकर्ताओं को कैसे संभालता है। इस मॉड्यूल के प्रयोजनों के लिए, हम अलगाव स्तर, आशावादी लॉकिंग और निराशावादी लॉकिंग की व्यापक श्रेणियों को देखेंगे।
नोट
संगामिति से परे लेनदेन लॉकिंग का पूरा विवरण प्रदर्शन से अधिक संबंधित है और न केवल कोड पर निर्भर है - हालांकि अच्छा कोड बेहतर प्रदर्शन करता है। कृपया अधिक विवरण के लिए गहराई से SQL सर्वर हस्तांतरण लॉकिंग और पंक्ति संस्करण मार्गदर्शिका की समीक्षा करें। ब्लॉक करने के बारे में जानकारी के लिए, SQL सर्वर कार्यक्षमता के दस्तावेज़ की भी समीक्षा करें।
आशावादी संगामिति
आशावादी लॉकिंग के साथ, एक धारणा है कि कुछ परस्पर विरोधी अपडेट होंगे। लेन-देन की शुरुआत में, डेटा की प्रारंभिक स्थिति दर्ज की जाती है। लेन-देन किए जाने से पहले, वर्तमान स्थिति की तुलना प्रारंभिक स्थिति से की जाती है। यदि राज्य समान हैं, तो लेनदेन पूरा हो गया है। यदि राज्य अलग-अलग हैं, तो लेनदेन वापस ले लिया जाता है।
उदाहरण के लिए, आपके पास पिछले वर्षों के विक्रय आदेशों वाली तालिका है. यह डेटा अक्सर अपडेट किया जाता है, लेकिन रिपोर्ट अक्सर चलाई जाती हैं। आशावादी लॉकिंग का उपयोग करके, लेनदेन एक दूसरे को ब्लॉक नहीं करते हैं और सिस्टम अधिक कुशलता से चलता है। दुर्भाग्य से, पिछले वर्षों के डेटा में त्रुटियां पाई गई हैं और अपडेट करने की आवश्यकता है। जबकि एक लेन-देन प्रत्येक पंक्ति को अपडेट कर रहा है, दूसरा लेनदेन एक ही समय में एक पंक्ति में मामूली संपादन करता है। चूँकि प्रारंभिक हस्तांतरण के दौरान डेटा की स्थिति परिवर्तित की गई थी, इसलिए संपूर्ण हस्तांतरण वापस ले लिया जाता है.
निराशावादी संगामिति
निराशावादी लॉकिंग के साथ, एक धारणा है कि एक ही समय में डेटा में कई अपडेट हो रहे हैं। ताले का उपयोग करके एक ही समय में केवल एक अपडेट हो सकता है, और अपडेट होने के दौरान डेटा के पढ़ने से रोका जाता है। यह बड़े रोलबैक को रोक सकता है, जैसा कि पिछले उदाहरण में देखा गया है, लेकिन प्रश्नों को अनावश्यक रूप से अवरुद्ध कर सकता है।
इष्टतम प्रदर्शन सुनिश्चित करने के लिए आशावादी या निराशावादी संगामिति का उपयोग करने का निर्णय लेते समय आपके डेटा की प्रकृति और डेटा पर चल रहे प्रश्नों पर विचार करना महत्वपूर्ण है।
स्नैपशॉट अलगाव
एसक्यूएल सर्वर में पांच अलग-अलग अलगाव स्तर हैं, लेकिन इस मॉड्यूल के लिए हम केवल READ_COMMITTED_SNAPSHOT_OFF और READ_COMMITTED_SNAPSHOT_ON पर ध्यान केंद्रित करेंगे। READ_COMMITTED_SNAPSHOT_OFF SQL सर्वर के लिए डिफ़ॉल्ट आइसोलेशन स्तर है। Azure SQL डेटाबेस के लिए डिफ़ॉल्ट आइसोलेशन स्तर READ_COMMITTED_SNAPSHOT_ON है.
READ_COMMITTED_SNAPSHOT_OFF लेन-देन के अंत तक प्रभावित पंक्तियों पर ताले रखेगा यदि क्वेरी पठन प्रतिबद्ध लेनदेन अलगाव स्तर का उपयोग कर रही है। हालांकि कुछ अपडेट होना संभव है, जैसे कि एक नई पंक्ति का निर्माण, यह डेटा में अधिकांश परस्पर विरोधी परिवर्तनों को पढ़ने या अपडेट करने से रोकेगा। यह निराशावादी समवर्ती है।
READ_COMMITTED_SNAPSHOT_ON डेटा का स्नैपशॉट लेता है। अपडेट तब उस स्नैपशॉट पर किए जाते हैं जिससे अन्य कनेक्शन मूल डेटा को क्वेरी कर सकते हैं। लेन-देन के अंत में डेटा की वर्तमान स्थिति की तुलना स्नैपशॉट से की जाती है। यदि डेटा समान है, तो लेनदेन किया जाता है। यदि डेटा भिन्न होता है, तो लेनदेन को वापस ले लिया जाता है।
आइसोलेशन स्तर को READ_COMMITTED_SNAPSHOT_ON में बदलने के लिए, निम्न आदेश जारी करें:
ALTER DATABASE *db_name* SET READ_COMMITTED_SNAPSHOT ON;
आइसोलेशन स्तर को READ_COMMITTED_SNAPSHOT_OFF में बदलने के लिए, निम्न आदेश जारी करें:
ALTER DATABASE *db_name* SET READ_COMMITTED_SNAPSHOT OFF;
यदि डेटाबेस को रीड कमिट स्नैपशॉट चालू करने के लिए बदल दिया गया है, तो कोई भी लेनदेन जो डिफ़ॉल्ट रीड कमिटेड आइसोलेशन स्तर का उपयोग करता है, आशावादी लॉकिंग का उपयोग करेगा।
नोट
स्नैपशॉट अलगाव केवल प्रतिबद्ध लेनदेन पढ़ने के लिए होता है। अन्य अलगाव स्तरों का उपयोग करने वाले लेनदेन प्रभावित नहीं होते हैं।