MariaDB
 sql >> डेटाबेस >  >> RDS >> MariaDB

MySQL में लॉक ग्रैन्युलैरिटी को समझना

यदि आप कुछ समय से MySQL के साथ काम कर रहे हैं, तो आपने शायद "टेबल-लेवल लॉकिंग" और "रो-लेवल लॉकिंग" शब्द सुने होंगे। ये शब्द MySQL में लॉक ग्रैन्युलैरिटी को संदर्भित करते हैं - इस ब्लॉग में हम बताएंगे कि उनका क्या मतलब है और उनका क्या उपयोग किया जा सकता है।

MySQL में लॉक ग्रैन्युलैरिटी क्या है?

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

मोटे तौर पर कहें तो MySQL में लॉक इन श्रेणियों में से एक में आते हैं। ताले हो सकते हैं:

  • पेज-स्तर - इस प्रकार के लॉक ग्रैन्युलैरिटी MySQL के पुराने इंजनों में उपलब्ध थे, विशेष रूप से BDB, जो कि अब MySQL 5.1 के रूप में अप्रचलित। संक्षेप में, BDB MySQL के पुराने संस्करणों में शामिल एक स्टोरेज इंजन था और यह एक ट्रांजेक्शनल स्टोरेज इंजन था जो पेज-लेवल लॉक का प्रदर्शन करता था। चूंकि इस प्रकार के लॉक ग्रैन्युलैरिटी का अब उपयोग नहीं किया जाता है, इसलिए हम यहां उनकी गहराई में नहीं जाएंगे, लेकिन सामान्य तौर पर, ये लॉक उस डेटा और इंडेक्स तक सीमित होते हैं जो किसी विशेष पृष्ठ पर रहते हैं। यदि आप बीडीबी के बारे में अधिक जानना चाहते हैं, तो मारियाडीबी के पेज को कुछ और जानकारी प्रदान करनी चाहिए।

  • टेबल-लेवल - MySQL, InnoDB को छोड़कर सभी स्टोरेज इंजन के लिए टेबल-लेवल लॉकिंग का उपयोग करता है।

  • पंक्ति-स्तर - पंक्ति-स्तरीय लॉकिंग का उपयोग InnoDB द्वारा किया जाता है।

टेबल-लेवल लॉकिंग के फायदे और नुकसान

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

यहां एक उदाहरण दिया गया है:एक बैंकिंग एप्लिकेशन की कल्पना करें जो डेटाबेस में दो तालिकाओं का उपयोग करता है - मान लें कि उन तालिकाओं को "चेकिंग" और "बचत" कहा जाता है। आपको किसी व्यक्ति के चेकिंग खाते से उसके बचत खाते में $100 स्थानांतरित करने की आवश्यकता है। तार्किक रूप से, आप निम्न चरणों का पालन करेंगे:

  1. सुनिश्चित करें कि खाते की शेष राशि $100 से अधिक है।

  2. चेकिंग खाते से $100 घटाएं।

  3. बचत खाते में $100 जोड़ें।

इन क्रियाओं को करने के लिए, आपको कुछ प्रश्नों की आवश्यकता होगी, उदाहरण के लिए:

SELECT balance FROM checking WHERE account_id = 123;
UPDATE checking SET balance = balance - 100 WHERE account_id = 123;
UPDATE savings SET balance = balance + 100 WHERE account_id = 123;

ये प्रश्न सरल लग सकते हैं, लेकिन यदि आप MyISAM का उपयोग करते हैं (हम एक उदाहरण के रूप में MyISAM का उपयोग करते हैं क्योंकि यह प्राथमिक भंडारण इंजनों में से एक है जो टेबल-लेवल लॉक का समर्थन करता है), तो आपको इस तथ्य से परिचित होना चाहिए कि इंजन एसीआईडी ​​​​का समर्थन नहीं करता है, जिसका अर्थ है कि यदि डेटाबेस सर्वर उन प्रश्नों में से किसी एक को निष्पादित करते समय दुर्घटनाग्रस्त हो जाता है, तो आप भाग्य से बाहर हैं:लोगों को दोनों खातों में या उनमें से किसी एक में नकद के साथ समाप्त हो सकता है। MySQL में ACID- आधारित लेनदेन का समर्थन करने वाला एकमात्र इंजन InnoDB है, इसलिए यदि आपको बहुत अधिक विश्वसनीय लेनदेन की आवश्यकता है, तो यह देखने लायक हो सकता है। InnoDB पंक्ति-स्तरीय लॉकिंग का भी समर्थन करता है - अब हम इस पर गौर करेंगे।

पंक्ति-स्तरीय लॉकिंग के लाभ और हानि

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

InnoDB में लॉक ग्रैन्युलैरिटी कैसे काम करती है?

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

InnoDB में अन्य प्रकार के ताले भी हैं - उनमें से कुछ में साझा और अनन्य ताले, इरादा ताले, रिकॉर्ड लॉक, गैप लॉक, अगली-कुंजी लॉक और अगला इरादा लॉक शामिल हैं। उदाहरण के लिए, इंटेंट लॉक को साझा या अनन्य भी किया जा सकता है - ऐसे ताले आमतौर पर संकेत देते हैं कि एक लेन-देन एक टेबल में अलग-अलग पंक्तियों पर एक निश्चित प्रकार का लॉक (एक साझा लॉक या एक विशेष लॉक) सेट करना चाहता है, एक रिकॉर्ड लॉक एक है इंडेक्स रिकॉर्ड आदि पर लॉक करें।

सामान्य तौर पर, InnoDB लॉक ग्रैन्युलैरिटी अन्य MySQL स्टोरेज इंजन (उदाहरण के लिए, MyISAM) में मौजूद लॉक ग्रैन्युलैरिटी से भिन्न होती है क्योंकि जब टेबल-लेवल लॉकिंग उपयोग में होती है, तो कुछ टेबल को अपडेट करने के लिए केवल एक सेशन होता है। समय चल सकता है। जब रो-लेवल लॉकिंग का उपयोग किया जाता है, तो MySQL कई सत्रों में एक साथ राइट एक्सेस का समर्थन करता है, जिससे रो-लेवल लॉकिंग स्टोरेज इंजन (InnoDB) मिशन-क्रिटिकल एप्लिकेशन के लिए उपयुक्त विकल्प बन जाता है।

लॉक ग्रैन्युलैरिटी और डेडलॉक

MySQL में लॉक ग्रैन्युलैरिटी और लॉकिंग लेवल बहुत अच्छी बात हो सकती है, लेकिन ये समस्याएं भी पैदा कर सकते हैं। लॉक ग्रैन्युलैरिटी के कारण होने वाली सबसे आम समस्याओं में से एक गतिरोध है - एक गतिरोध तब होता है जब विभिन्न MySQL लेनदेन आगे बढ़ने में असमर्थ होते हैं क्योंकि उनमें से प्रत्येक में एक लॉक होता है जिसकी दूसरे को आवश्यकता होती है। शुक्र है, InnoDB स्टोरेज इंजन का उपयोग करते समय, डेडलॉक डिटेक्शन डिफ़ॉल्ट रूप से सक्षम होता है - जब एक गतिरोध का पता चलता है, तो InnoDB स्वचालित रूप से एक लेनदेन को वापस ले लेता है। यदि आप MySQL में लॉक ग्रैन्युलैरिटी के साथ काम करते समय गतिरोध का सामना करते हैं, तो चिंता न करें - अपने लेनदेन को फिर से शुरू करने पर विचार करें। अपने डेटाबेस की लगातार निगरानी करने के लिए, आपको ClusterControl द्वारा प्रदान की गई सुविधाओं का उपयोग करने पर भी विचार करना चाहिए।

ClusterControl आपकी कैसे मदद कर सकता है?

यहाँ कुछ चीज़ें दी गई हैं जिनमें ClusterControl विकसित किया गया है, जो कि कईनीन्स द्वारा विकसित किया गया है, जो आपकी मदद कर सकता है:

  • आपके सभी व्यावसायिक डेटा की सुरक्षा

    • यदि आपका डेटा दूषित है (जो कि ACID-संगत स्टोरेज इंजन का उपयोग न करने के कारण या इसके द्वारा भी हो सकता है) ऊपर वर्णित अन्य कारक) टूल एक स्वचालित प्रक्रिया चला सकता है जो वास्तव में सत्यापित करती है कि आप अपना डेटा पुनर्प्राप्त कर सकते हैं।

    • उपकरण आपको बता सकता है कि कौन से डेटाबेस का बैकअप नहीं लिया गया है या आपको आपके बैकअप की स्थिति दिखा सकता है (चाहे वे सफल रहे या वे असफल रहे)

  • आपके डेटाबेस संचालन का स्वचालन

    • ClusterControl यह सुनिश्चित करने में आपकी सहायता कर सकता है कि आपके sysadmins, Developers और DBA उद्योग का उपयोग करके न्यूनतम जोखिमों के साथ पूरे डेटाबेस क्लस्टर को कुशलतापूर्वक प्रबंधित करते हैं सर्वोत्तम अभ्यास

  • सामान्य रूप से अपने डेटाबेस के बुनियादी ढांचे को प्रभावी ढंग से प्रबंधित करना

    • आज की तकनीकों में परिष्कृत बुनियादी ढांचे के समाधान के साथ बदलाव के लिए उच्च उपलब्धता और इष्टतम प्रदर्शन प्राप्त करने के लिए उन्नत उपकरणों और ज्ञान की आवश्यकता है आपके व्यवसाय-महत्वपूर्ण अनुप्रयोग। ClusterControl आपको MySQL, MariaDB, MongoDB, PostgreSQL, TimeScaleDB और अन्य सहित सबसे लोकप्रिय ओपन सोर्स डेटाबेस तकनीकों के परिनियोजन, निगरानी, ​​प्रबंधन और स्केलिंग में भी मदद कर सकता है।

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

सारांश

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle डेटाबेस से MariaDB में स्थानांतरण - एक गहरा गोता

  2. मारियाडीबी आपके नजदीकी शहर में आ रहा है!

  3. मारियाडीबी में OCTET_LENGTH () कैसे काम करता है

  4. कैसे बिन () मारियाडीबी में काम करता है

  5. बेंचमार्किंग मैनुअल डेटाबेस परिनियोजन बनाम स्वचालित परिनियोजन