डेटाबेस सिस्टम में डेटा स्थिरता और अखंडता की गारंटी देने के लिए एक जनादेश होता है, खासकर जब महत्वपूर्ण डेटा शामिल होता है। इन पहलुओं को MongoDB में ACID लेनदेन के माध्यम से लागू किया जाता है। डेटाबेस में कोई भी अपडेट करने से पहले एसीआईडी लेनदेन को डेटा वैधता के लिए कुछ परिभाषित नियमों को पूरा करना चाहिए अन्यथा इसे निरस्त कर दिया जाना चाहिए और डेटाबेस में कोई बदलाव नहीं किया जाएगा। सभी डेटाबेस लेनदेन को एकल तार्किक संचालन के रूप में माना जाता है और निष्पादन समय के दौरान डेटाबेस को असंगत स्थिति में रखा जाता है जब तक कि परिवर्तन नहीं किए जाते हैं। वे ऑपरेशन जो डेटाबेस की स्थिति को सफलतापूर्वक बदलते हैं, उन्हें राइट ट्रांजैक्शन कहा जाता है, जबकि वे ऑपरेशन जो डेटाबेस को अपडेट नहीं करते हैं, लेकिन केवल डेटा को पुनः प्राप्त करते हैं, उन्हें रीड-ओनली ट्रांजैक्शन कहा जाता है। ACID एटॉमिकिटी, कंसिस्टेंसी, आइसोलेशन और ड्यूरेबिलिटी का संक्षिप्त नाम है।
डेटाबेस एक साझा संसाधन है जिसे अलग-अलग उपयोगकर्ताओं द्वारा अलग-अलग या एक ही समय में एक्सेस किया जा सकता है। इस कारण से, समवर्ती लेनदेन हो सकते हैं और यदि अच्छी तरह से प्रबंधित नहीं किया जाता है, तो उनका परिणाम सिस्टम क्रैश, हार्डवेयर विफलता, गतिरोध, धीमा डेटाबेस प्रदर्शन या उसी लेनदेन के निष्पादन में दोहराव हो सकता है।
एसिड नियम क्या हैं?
डेटा अखंडता की गारंटी के लिए सभी डेटाबेस सिस्टम को ACID गुणों को पूरा करना चाहिए।
परमाणुता
एक लेन-देन को संचालन की एकल इकाई के रूप में माना जाता है जो या तो पूरी तरह से सफल हो सकता है या पूरी तरह से विफल हो सकता है। एक लेनदेन आंशिक रूप से निष्पादित नहीं किया जा सकता है। यदि किसी लेन-देन से परामर्श करने वाली कोई शर्त विफल हो जाती है, तो संपूर्ण लेन-देन पूरी तरह से विफल हो जाएगा और डेटाबेस अपरिवर्तित रहेगा। उदाहरण के लिए, यदि आप खाते X से Y में फंड ट्रांसफर करना चाहते हैं, तो यहां दो लेन-देन हैं, पहला है X से फंड निकालना और दूसरा है Y में फंड रिकॉर्ड करना। यदि पहला ट्रांजैक्शन फेल हो जाता है, तो पूरा ट्रांजैक्शन लेन-देन निरस्त कर दिया जाएगा
संगति
जब कोई ऑपरेशन जारी किया जाता है, तो निष्पादन से पहले, डेटाबेस एक सुसंगत स्थिति में होता है और इसे प्रत्येक लेनदेन के बाद ऐसा ही रहना चाहिए। यहां तक कि अगर कोई अपडेट है, तो लेनदेन को हमेशा डेटाबेस को वैध स्थिति में लाना चाहिए, डेटाबेस इनवेरिएंट को बनाए रखना चाहिए। उदाहरण के लिए, आप एक प्राथमिक कुंजी को हटा नहीं सकते हैं जिसे किसी अन्य संग्रह में विदेशी कुंजी के रूप में संदर्भित किया गया है। अवैध लेनदेन से डेटा भ्रष्टाचार को रोकने के लिए सभी डेटा को परिभाषित बाधाओं को पूरा करना चाहिए।
अलगाव
एक साथ चलने वाले कई लेन-देन एक-दूसरे को प्रभावित किए बिना निष्पादित किए जाते हैं और यदि उन्हें क्रमिक रूप से निष्पादित किया जाना है तो उनका परिणाम समान होना चाहिए। जब दो या दो से अधिक लेन-देन MongoDB में समान दस्तावेज़ों को संशोधित करते हैं, तो एक विरोध हो सकता है। डेटाबेस प्रतिबद्ध होने से तुरंत पहले एक संघर्ष का पता लगाएगा। दस्तावेज़ पर लॉक प्राप्त करने के लिए पहला ऑपरेशन जारी रहेगा जबकि दूसरा विफल हो जाएगा और एक विरोध त्रुटि संदेश प्रस्तुत किया जाएगा।
टिकाऊपन
यह निर्देश देता है कि, एक बार लेन-देन हो जाने के बाद, सिस्टम के विफल होने की स्थिति में भी, उदाहरण के लिए पावर आउटेज या इंटरनेट डिस्कनेक्शन के कारण, परिवर्तनों को हर समय बरकरार रखा जाना चाहिए।
मोंगोडीबी एसिड लेनदेन
MongoDB एक दस्तावेज़ आधारित NoSQL डेटाबेस है जिसमें एक लचीली स्कीमा है। लेन-देन ऐसे संचालन नहीं हैं जिन्हें प्रत्येक लेखन कार्य के लिए निष्पादित किया जाना चाहिए, क्योंकि उनमें एक दस्तावेज़ लिखने की तुलना में अधिक प्रदर्शन लागत होती है। दस्तावेज़ आधारित संरचना और असामान्य डेटा मॉडल के साथ, लेनदेन की न्यूनतम आवश्यकता होगी। चूंकि MongoDB दस्तावेज़ एम्बेडिंग की अनुमति देता है, इसलिए आपको लिखने के संचालन को पूरा करने के लिए लेनदेन का उपयोग करने की आवश्यकता नहीं है।
MongoDB संस्करण 4.0 केवल प्रतिकृति सेट परिनियोजन के लिए बहु-दस्तावेज़ लेनदेन समर्थन प्रदान करता है और संभवतः संस्करण 4.2 शार्प्ड परिनियोजन (उनके रिलीज़ नोट्स के अनुसार) के लिए समर्थन का विस्तार करेगा।
लेन-देन का उदाहरण:
सुनिश्चित करें कि आपके पास पहले एक प्रतिकृति सेट है। मान लें कि आपके पास ऐप नामक डेटाबेस है और मोंगो शैल में संग्रह उपयोगकर्ता निम्न आदेश चलाते हैं:
$mongos और आपको उपयोगकर्ता नाम जैसा कुछ दिखाई देना चाहिए:PRIMARY>
$use app
$db.users.insert([{_id:1, name: ‘Brian’}, {_id:2, name: ‘Sheila’}, {_id:3, name: ‘James’}])
हमें अपने लेन-देन के लिए एक सत्र शुरू करने की आवश्यकता है:
$db.getMongo().startSession() and you should see something like
session { "id" : UUID("dcfa8de5-627d-3b1c-a890-63c9a355520c") }
इस सत्र का उपयोग करके हम निम्नलिखित आदेशों के साथ लेन-देन का उपयोग करके अधिक उपयोगकर्ताओं को जोड़ सकते हैं
$session.startTransaction()
session.getDatabase(‘app’).users.insert({_id:4, name: ‘Hitler’})
आपको WriteResult({“nInsterted”:2})
के साथ प्रस्तुत किया जाएगालेन-देन अभी तक नहीं किया गया है और सामान्य $db.users.find({}) हमें केवल पहले सहेजे गए उपयोगकर्ता ही देगा। लेकिन अगर हम
. चलाते हैं$session.getDatabase(“app”).users.find()
अंतिम जोड़ा गया रिकॉर्ड लौटाए गए परिणामों में उपलब्ध होगा। इस लेन-देन को करने के लिए, हम नीचे कमांड चलाते हैं
$session.commitTransaction()
लेन-देन संशोधन को मेमोरी में संग्रहीत किया जाता है, इसलिए विफलता के बाद भी, डेटा पुनर्प्राप्ति पर उपलब्ध रहेगा।
MongoDB में बहु-दस्तावेज़ ACID लेनदेन
ये मल्टी-स्टेटमेंट ऑपरेशन हैं जिन्हें एक-दूसरे को प्रभावित किए बिना क्रमिक रूप से निष्पादित करने की आवश्यकता होती है। ऊपर के नमूने के लिए हम दो लेन-देन बना सकते हैं, एक उपयोगकर्ता को जोड़ने के लिए और दूसरा उपयोगकर्ता को आयु के क्षेत्र के साथ अपडेट करने के लिए। यानी
$session.startTransaction()
db.users.insert({_id:6, name “Ibrahim”})
db.users.updateOne({_id:3 , {$set:{age:50}}})
session.commit_transaction()
एक या कई संग्रह/डेटाबेस में निहित कई दस्तावेज़ों के विरुद्ध संचालन पर लेनदेन लागू किया जा सकता है। दस्तावेज़ लेन-देन के कारण कोई भी परिवर्तन संबंधित कार्यभार के प्रदर्शन को प्रभावित नहीं करता है या उनकी आवश्यकता नहीं है। लेन-देन के प्रतिबद्ध होने तक, अनकमिटेड राइट्स को न तो सेकेंडरी नोड्स में दोहराया जाता है और न ही वे लेनदेन के बाहर पढ़ने योग्य होते हैं।
MongoDB लेनदेन के लिए सर्वोत्तम अभ्यास
बहु-दस्तावेज़ लेनदेन केवल WiredTiger संग्रहण इंजन में समर्थित हैं। जैसा कि पहले उल्लेख किया गया है, बहुत कम अनुप्रयोगों के लिए लेनदेन की आवश्यकता होगी और यदि ऐसा है, तो हमें उन्हें छोटा करने का प्रयास करना चाहिए। अन्यथा, एक एकल ACID लेनदेन के लिए, यदि आप अत्यधिक संख्या में संचालन करने का प्रयास करते हैं, तो इसके परिणामस्वरूप WiredTiger कैश पर उच्च दबाव हो सकता है। सबसे पुराना स्नैपशॉट बनाए जाने के बाद से सभी बाद के लेखन के लिए कैश को हमेशा स्थिति बनाए रखने के लिए निर्धारित किया जाता है। इसका मतलब है कि लेन-देन की पूरी अवधि के दौरान कैश में नए लेखन जमा हो जाएंगे और पुराने स्नैपशॉट पर चल रहे लेनदेन के प्रतिबद्ध होने या निरस्त होने के बाद ही फ्लश किया जाएगा। लेन-देन पर सर्वश्रेष्ठ डेटाबेस प्रदर्शन के लिए, डेवलपर्स को इस पर विचार करना चाहिए:
- लेन-देन में हमेशा कम संख्या में दस्तावेज़ों को संशोधित करें। अन्यथा, आपको लेन-देन को अलग-अलग हिस्सों में तोड़ना होगा और दस्तावेजों को अलग-अलग बैचों में संसाधित करना होगा। अधिक से अधिक, एक बार में 1000 दस्तावेज़ संसाधित करें।
- अस्थायी अपवाद जैसे कि प्राथमिक और क्षणिक नेटवर्क हिचकी का चुनाव करने की प्रतीक्षा में लेनदेन का गर्भपात हो सकता है। यदि परिभाषित त्रुटियां प्रस्तुत की जाती हैं, तो डेवलपर्स को लेन-देन का पुन:प्रयास करने के लिए एक तर्क स्थापित करना चाहिए।
- मोंगोडीबी द्वारा प्रदान किए गए डिफ़ॉल्ट 60 सेकंड से लेनदेन के निष्पादन के लिए इष्टतम अवधि को कॉन्फ़िगर करें। इसके अलावा, इंडेक्सिंग को नियोजित करें ताकि यह लेनदेन के भीतर तेजी से डेटा एक्सेस की अनुमति दे सके। आपके पास लेन-देन को समय-सीमा के भीतर निष्पादित करने की अनुमति देने वाले बैचों में तोड़कर टाइमआउट को संबोधित करने में फ़ाइन-ट्यून करने का लचीलापन भी है।
- अपने लेन-देन को एक छोटे से संचालन के सेट में विघटित करें ताकि यह 16MB आकार की बाधाओं को पूरा कर सके। अन्यथा, यदि ओप्लॉग विवरण के साथ संचालन इस सीमा से अधिक हो जाता है, तो लेन-देन निरस्त कर दिया जाएगा।
- एक इकाई से संबंधित सभी डेटा को एक एकल, समृद्ध दस्तावेज़ संरचना में संग्रहित किया जाना चाहिए। यह उन दस्तावेज़ों की संख्या को कम करने के लिए है जिन्हें अलग-अलग क्षेत्रों को बदलने के लिए कैश किया जाना है।
लेन-देन की सीमाएं
- आप किसी लेन-देन के अंदर संग्रह बना या छोड़ नहीं सकते।
- लेन-देन किसी कैप्ड संग्रह को नहीं लिख सकते हैं
- लेन-देन को निष्पादित करने में बहुत समय लगता है और किसी तरह वे डेटाबेस के प्रदर्शन को धीमा कर सकते हैं।
- लेन-देन का आकार 16MB तक सीमित है जिसके लिए किसी को भी इस आकार से अधिक छोटे लेन-देन में विभाजित करने की आवश्यकता होती है।
- एक लेन-देन के लिए बड़ी संख्या में दस्तावेजों के अधीन होने से WiredTiger इंजन पर अत्यधिक दबाव पड़ सकता है और चूंकि यह स्नैपशॉट क्षमता पर निर्भर करता है, इसलिए मेमोरी में बड़े अनफ्लश किए गए संचालन का प्रतिधारण होगा। यह डेटाबेस पर कुछ प्रदर्शन लागत प्रदान करता है।
निष्कर्ष
MongoDB संस्करण 4.0 ने डेटा अखंडता और स्थिरता में सुधार की सुविधा के रूप में प्रतिकृति सेट के लिए बहु-दस्तावेज़ लेनदेन समर्थन की शुरुआत की। हालांकि, बहुत कम एप्लिकेशन हैं जिन्हें MongoDB का उपयोग करते समय लेनदेन की आवश्यकता होती है। जहां तक लेन-देन की अवधारणा का संबंध है, इस सुविधा की सीमाएं हैं जो इसे काफी कम अपरिपक्व बनाती हैं। उदाहरण के लिए, शार्प किए गए क्लस्टर के लिए लेन-देन समर्थित नहीं हैं और वे 16MB आकार सीमा से बड़े नहीं हो सकते हैं। डेटा मॉडलिंग आपके डेटाबेस में लेनदेन को कम करने के लिए एक बेहतर संरचना प्रदान करता है। जब तक आप विशेष मामलों से निपट नहीं रहे हैं, मोंगोडीबी में लेनदेन से बचने के लिए यह एक बेहतर अभ्यास होगा।