MongoDB लॉकिंग अलग है
MongoDB में लॉक करना RDBMS में लॉक करने जैसा काम नहीं करता है, इसलिए थोड़ा स्पष्टीकरण क्रम में है। MongoDB के पुराने संस्करणों में, एक एकल वैश्विक पाठक/लेखक कुंडी थी। MongoDB 2.2 से शुरू होकर, प्रत्येक डेटाबेस के लिए एक रीडर/राइटर लैच होता है।
पाठक-लेखक कुंडी
कुंडी बहु-पाठक, एकल-लेखक और लेखक-लालची है। इसका मतलब है कि:
- डेटाबेस पर असीमित संख्या में एक साथ पाठक हो सकते हैं
- किसी एक डेटाबेस में किसी भी संग्रह पर एक समय में केवल एक लेखक हो सकता है (इस पर थोड़ा और अधिक)
- लेखक पाठकों को ब्लॉक करते हैं
- "लेखक-लालची" से मेरा मतलब है कि एक बार लिखने का अनुरोध आने के बाद, सभी पाठकों को तब तक अवरुद्ध कर दिया जाता है जब तक कि लेखन पूरा नहीं हो जाता (इस पर बाद में और अधिक)
ध्यान दें कि मैं इसे "लॉक" के बजाय "लच" कहता हूं। ऐसा इसलिए है क्योंकि यह हल्का है, और ठीक से डिज़ाइन किए गए स्कीमा में राइट लॉक एक दर्जन या इतने माइक्रोसेकंड के क्रम में आयोजित किया जाता है। पाठक-लेखक लॉकिंग पर अधिक जानकारी के लिए यहां देखें।
MongoDB में आप जितनी चाहें एक साथ कई क्वेरी चला सकते हैं:जब तक प्रासंगिक डेटा RAM में है, वे सभी बिना किसी विरोध के संतुष्ट होंगे।
परमाणु दस्तावेज़ अपडेट
याद रखें कि MongoDB में लेन-देन का स्तर एक ही दस्तावेज़ है। एक दस्तावेज़ के सभी अद्यतन परमाणु हैं। MongoDB इसे केवल तब तक राइट लैच को पकड़कर प्राप्त करता है जब तक कि RAM में किसी एकल दस्तावेज़ को अपडेट करने में समय लगता है। यदि कोई धीमी गति से चलने वाला संचालन है (विशेष रूप से, यदि किसी दस्तावेज़ या अनुक्रमणिका प्रविष्टि को डिस्क से पृष्ठांकित करने की आवश्यकता है), तो वह ऑपरेशन उपज होगा लेखन कुंडी। जब ऑपरेशन कुंडी देता है, तो अगला कतारबद्ध ऑपरेशन आगे बढ़ सकता है।
इसका मतलब यह है कि एक ही डेटाबेस में सभी दस्तावेज़ों को लिखने को क्रमबद्ध किया जाता है। यह एक समस्या हो सकती है यदि आपके पास खराब स्कीमा डिज़ाइन है, और आपके लेखन में लंबा समय लगता है, लेकिन ठीक से डिज़ाइन किए गए स्कीमा में, लॉकिंग कोई समस्या नहीं है।
लेखक-लालची
लेखक-लालची होने पर कुछ और शब्द:
एक समय में केवल एक लेखक ही कुंडी पकड़ सकता है; कई पाठक एक बार में कुंडी पकड़ सकते हैं। एक भोले-भाले कार्यान्वयन में, लेखक अनिश्चित काल तक भूखे रह सकते थे यदि संचालन में एक भी पाठक होता। इससे बचने के लिए, MongoDB कार्यान्वयन में, एक बार कोई एकल थ्रेड किसी विशेष कुंडी के लिए एक लिखित अनुरोध करता है
- उस कुंडी की आवश्यकता वाले सभी बाद के पाठकों को अवरुद्ध कर दिया जाएगा
- वह लेखक तब तक प्रतीक्षा करेगा जब तक कि सभी मौजूदा पाठक समाप्त नहीं हो जाते
- लेखक राइट लैच हासिल करेगा, अपना काम करेगा, और फिर राइट लैच को छोड़ देगा
- सभी कतारबद्ध पाठक अब आगे बढ़ेंगे
वास्तविक व्यवहार जटिल है, क्योंकि यह लेखक-लालची व्यवहार उन तरीकों से उपज के साथ बातचीत करता है जो स्पष्ट नहीं हो सकते हैं। याद रखें कि, रिलीज़ 2.2 से शुरू होकर, एक अलग . है प्रत्येक डेटाबेस के लिए लैच, इसलिए डेटाबेस 'ए' में किसी भी संग्रह को लिखने के लिए डेटाबेस 'बी' में किसी भी संग्रह को लिखने की तुलना में एक अलग लैच प्राप्त होगा।
विशिष्ट प्रश्न
विशिष्ट प्रश्नों के संबंध में:
- ताला (वास्तव में कुंडी) MongoDB कर्नेल द्वारा केवल एक दस्तावेज़ को अपडेट करने में लगने वाले समय तक ही रखा जाता है
- यदि आपके पास MongoDB में कई कनेक्शन आ रहे हैं, और उनमें से प्रत्येक लेखन की एक श्रृंखला का प्रदर्शन कर रहा है, तो लैच प्रति-डेटाबेस के आधार पर केवल तब तक आयोजित किया जाएगा जब तक कि उस लेखन को पूरा होने में समय लगता है ली>
- लिखने में आने वाले कई कनेक्शन (अपडेट/सम्मिलित/हटाएं) सभी इंटरलीव किए जाएंगे
हालांकि ऐसा लगता है कि यह एक बड़ी प्रदर्शन चिंता होगी, व्यवहार में यह चीजों को धीमा नहीं करता है। ठीक से डिज़ाइन किए गए स्कीमा और एक विशिष्ट कार्यभार के साथ, MongoDB किसी भी डेटाबेस पर लॉक प्रतिशत 50% से ऊपर जाने से पहले - यहां तक कि एक SSD के लिए भी डिस्क I/O क्षमता को संतृप्त करेगा।
मुझे पता है कि उच्चतम क्षमता वाला MongoDB क्लस्टर वर्तमान में प्रति सेकंड 2 मिलियन राइट्स का प्रदर्शन कर रहा है।