डेडलॉक, लॉकिंग और MVCC
डेटाबेस टकरावों से कैसे बचते हैं और लॉकिंग बनाम स्नैपशॉट के बीच के समझौते
डेडलॉक, लॉकिंग और MVCC, CoddyKit पर कोडिंग साक्षात्कार की तैयारी का एक निःशुल्क पाठ है। यह 4 में से 4वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह कोडिंग साक्षात्कार की तैयारी सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। कोडिंग साक्षात्कार की तैयारी पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
डेटाबेस वास्तव में पृथक्करण कैसे लागू करते हैं
पृथक्करण स्तर एक वादा हैं; अवरोधन और MVCC वे तंत्र हैं जो इसे पूरा करते हैं। साक्षात्कारकर्ता इन विषयों के बारे में यह जानने के लिए पूछते हैं कि लेन-देन टकराने पर आंतरिक रूप से क्या होता है।
दो व्यापक रणनीतियाँ हैं:
- निराशावादी (अवरोधन-आधारित): टकराव वाले अभिगम को अवरोध हटने तक रोकना।
- आशावादी / MVCC: सभी को सुसंगत डेटा-प्रतिचित्र पढ़ने देना और COMMIT के समय टकरावों का पता लगाना।
इस पाठ में अवरोध, गतिरोध और MVCC के साथ-साथ इनके बीच के लाभ-हानि संबंधों को शामिल किया गया है।
साझा बनाम विशिष्ट अवरोध
पारंपरिक अवरोधन में दो मुख्य प्रकार होते हैं:
- साझा (S) अवरोध पठन के लिए होता है। एक ही समय में कई लेन-देन एक ही पंक्ति पर साझा अवरोध रख सकते हैं।
- विशिष्ट (X) अवरोध लेखन के लिए होता है। इसे केवल एक लेन-देन रख सकता है और यह उस पंक्ति पर अन्य सभी अवरोधों को रोकता है।
नियम यह है: S, S के साथ संगत है, लेकिन X किसी के साथ संगत नहीं है। लेखन करने वाले को सभी पठनकर्ताओं के समाप्त होने तक प्रतीक्षा करनी पड़ती है और पठनकर्ताओं को लेखन करने वाले के लिए प्रतीक्षा करनी पड़ती है।
SELECT FOR UPDATE से स्पष्ट अवरोधन
आप उन पंक्तियों पर लेखन-अवरोध का अनुरोध कर सकते हैं जिन्हें आपने केवल पढ़ा है, ताकि आपके कार्रवाई करने से पहले दूसरे उन्हें बदल न सकें। पढ़ो-बदलो-लिखो प्रक्रिया में खोए हुए अद्यतनों से बचने का यह मानक तरीका है।
SELECT ... FOR UPDATE विशिष्ट पंक्ति-अवरोध लगाता है; पंक्तियाँ तब तक अवरुद्ध रहती हैं जब तक आप COMMIT या ROLLBACK नहीं करते।
BEGIN;
-- lock the row so no one else can modify it concurrently
SELECT balance FROM accounts WHERE id = 1 FOR UPDATE;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
COMMIT; -- lock released hereगतिरोध क्या है
गतिरोध तब होता है जब दो या अधिक लेन-देन में से प्रत्येक ऐसा अवरोध थामे रहता है जिसकी दूसरे को आवश्यकता है। इससे ऐसा चक्र बनता है जिसमें कोई भी आगे नहीं बढ़ सकता।
पाठ्यपुस्तक वाला उदाहरण: T1 पहले पंक्ति A पर अवरोध लगाता है और फिर पंक्ति B चाहता है; T2 पहले पंक्ति B पर अवरोध लगाता है और फिर पंक्ति A चाहता है। दोनों एक-दूसरे के लिए हमेशा प्रतीक्षा करते रहते हैं।
डेटाबेस प्रतीक्षा-निर्भरता ग्राफ़ की सहायता से इसका पता लगाते हैं। चक्र मिल जाने पर प्रणाली एक लेन-देन को पीड़ित चुनकर निरस्त कर देती है और गतिरोध त्रुटि लौटाती है, ताकि बाकी लेन-देन आगे बढ़ सकें।
गतिरोध: समयरेखा
अवरोध लगाने के क्रम को एक-दूसरे को काटते हुए देखिए। T1 पहले पंक्ति 1 लेता है और फिर पंक्ति 2 माँगता है; T2 पहले पंक्ति 2 लेता है और फिर पंक्ति 1 माँगता है। कोई भी अवरोध नहीं हटाता, इसलिए प्रणाली एक लेन-देन को निरस्त कर देती है।
निरस्त किया गया लेन-देन deadlock detected जैसी त्रुटि देखता है और उसे फिर प्रयास करना पड़ता है। बचा हुआ लेन-देन सामान्य रूप से COMMIT करता है।
-- T1 | -- T2
BEGIN; | BEGIN;
UPDATE accounts SET balance=balance-10 | UPDATE accounts SET balance=balance-10
WHERE id=1; -- locks row 1 | WHERE id=2; -- locks row 2
UPDATE accounts SET balance=balance+10 | UPDATE accounts SET balance=balance+10
WHERE id=2; -- waits for T2 | WHERE id=1; -- waits for T1 -> CYCLE
-- one transaction is chosen as victim and rolled backगतिरोध रोकना
आप गतिरोधों को पूरी तरह समाप्त नहीं कर सकते, लेकिन उन्हें दुर्लभ बना सकते हैं। साक्षात्कार में मानक उत्तर ये हैं:
- अवरोध लगाने का सुसंगत क्रम: पंक्तियाँ हमेशा एक ही क्रम में लें, जैसे बढ़ते हुए id के क्रम में। इससे चक्र टूट जाता है।
- लेन-देन छोटे रखें: अवरोधों को जितना संभव हो उतने कम समय के लिए रखें।
- सुरक्षित होने पर कम पृथक्करण स्तर अपनाएँ: कम अवरोध, कम टकराव।
- दोबारा प्रयास की व्यवस्था जोड़ें: गतिरोध के कारण निरस्त किए गए लेन-देन को अपने-आप फिर प्रयास करना चाहिए।
सुसंगत क्रम सबसे प्रभावी समाधान है और साक्षात्कारकर्ता सबसे पहले यही सुनना चाहते हैं।
अवरोध का विस्तार-स्तर
अवरोध अलग-अलग दायरों में लगाए जा सकते हैं; यह समवर्तीता और अतिरिक्त लागत के बीच एक समझौता है:
- पंक्ति-स्तरीय अवरोध अधिक समवर्तीता देते हैं, लेकिन उन्हें सँभालने में अधिक लागत आती है।
- पृष्ठ या तालिका स्तर के अवरोधों की निगरानी सस्ती होती है, लेकिन वे अधिक लेन-देन को रोकते हैं।
कुछ डेटाबेस प्रणालियाँ तब पंक्ति-अवरोध से तालिका-अवरोध पर चली जाती हैं जब कोई लेन-देन बहुत अधिक पंक्तियों को छूता है (अवरोध-स्तर वृद्धि)। इससे समझ आता है कि बड़ा सामूहिक UPDATE अचानक सबको क्यों रोक सकता है।
MVCC: प्रतिचित्र वाला तरीका
MVCC (बहु-संस्करण समवर्ती नियंत्रण) वह तरीका है जिससे पोस्टग्रेज़, ओरेकल और InnoDB अधिकांश पठन-अवरोधों से बचते हैं। अवरोध लगाने के बजाय डेटाबेस हर पंक्ति के कई संस्करण रखता है।
इसका मुख्य लाभ, और साक्षात्कारों में अक्सर बताया जाने वाला वाक्य, यह है: पठन करने वाले लेखन करने वालों को नहीं रोकते, और लेखन करने वाले पठन करने वालों को नहीं रोकते।
हर लेन-देन किसी समय-बिंदु के अनुसार सुसंगत डेटा-प्रतिचित्र देखता है, जबकि लेखन करने वाले लेन-देन पंक्तियों को उसी स्थान पर अधिलेखित करने के बजाय उनके नए संस्करण बनाते हैं।
MVCC अंदर से कैसे काम करता है
जब किसी पंक्ति को अद्यतन किया जाता है, तो MVCC एक नया संस्करण लिखता है और पुराना संस्करण रखता है। हर संस्करण में लेन-देन-पहचान संबंधी मेटाडेटा होता है (पोस्टग्रेज़ में xmin और xmax), जो यह दर्ज करता है कि वह कब दिखाई देने योग्य हुआ और कब उसकी जगह नया संस्करण आ गया।
लेन-देन का डेटा-प्रतिचित्र तय करता है कि उसे कौन-सा संस्करण दिखाई देगा। जिन पुराने संस्करणों को अब कोई भी लेन-देन नहीं देख सकता, वे अप्रयुक्त पंक्ति-इकाइयाँ बन जाते हैं और बाद में सफाई प्रक्रिया द्वारा हटा दिए जाते हैं। पोस्टग्रेज़ में यह प्रक्रिया VACUUM है; इसे न चलाने से तालिका-विस्तार होता है, जिसके बारे में अक्सर अगला प्रश्न पूछा जाता है।
अवरोधन बनाम MVCC: लाभ-हानि
तुलना को संक्षेप में इस तरह बताइए:
- शुद्ध अवरोधन: शुद्धता सरल रहती है, लेकिन पठन करने वाले और लेखन करने वाले एक-दूसरे को रोकते हैं, जिससे समवर्तीता घटती है।
- MVCC: पठन में उत्कृष्ट समवर्तीता और पठन-अवरोधों से मुक्ति मिलती है, लेकिन इसके लिए संस्करणों के भंडारण और सफाई (VACUUM, तालिका-विस्तार) की लागत चुकानी पड़ती है और लेखन-लेखन टकरावों के लिए अब भी अवरोध आवश्यक होते हैं।
MVCC वाली प्रणालियाँ भी लेखन के समय अवरोध लगाती हैं: एक ही पंक्ति को अद्यतन करने वाले दो लेन-देन को क्रम से चलना पड़ता है। MVCC पठन-लेखन की प्रतिस्पर्धा हटाता है, लेखन-लेखन की नहीं।
आशावादी अवरोधन और संस्करण स्तंभ
डेटाबेस प्रणाली के MVCC से परे, अनुप्रयोग अक्सर लंबे उपयोगकर्ता-सत्रों में पढ़ो-बदलो-लिखो प्रक्रिया के लिए आशावादी अवरोधन जोड़ते हैं। आप एक version स्तंभ जोड़ते हैं, उसका मान पढ़ते हैं और अद्यतन के समय उसी संस्करण के मेल की शर्त रखते हुए उसे बढ़ा देते हैं।
यदि किसी दूसरे लेन-देन ने पहले पंक्ति को अद्यतन कर दिया, तो संस्करण मेल नहीं खाता, शून्य पंक्तियाँ प्रभावित होती हैं और आपका कोड जान जाता है कि डेटा फिर लोड करके दोबारा प्रयास करना है। उपयोगकर्ता के सोचने के दौरान कोई अवरोध नहीं रखा जाता, इसलिए समवर्तीता अधिक रहती है। साक्षात्कारकर्ता इसे इस प्रश्न के उत्तर के रूप में पसंद करते हैं: "दो उपयोगकर्ताओं के एक ही अभिलेख को संपादित करने पर आप क्या करेंगे?"
-- read: SELECT id, data, version FROM items WHERE id = 1; -- version = 7
UPDATE items
SET data = 'new value', version = version + 1
WHERE id = 1 AND version = 7;
-- if rows affected = 0, someone else changed it: reload and retryत्वरित जाँच
MVCC की मुख्य बात जाँचिए।
पुनरावलोकन: अवरोध, गतिरोध और MVCC
अब आप पृथक्करण के पीछे की कार्यप्रणाली समझा सकते हैं:
- साझा/विशिष्ट अवरोध अभिगम का समन्वय करते हैं;
SELECT FOR UPDATEस्पष्ट लेखन-अवरोध लगाता है। - गतिरोध अवरोधों के चक्र होते हैं; प्रणाली एक पीड़ित लेन-देन को निरस्त करती है और अवरोध लगाने का सुसंगत क्रम अधिकांश गतिरोधों को रोकता है।
- MVCC पंक्तियों के संस्करण रखता है, जिससे पठन करने वाले और लेखन करने वाले एक-दूसरे को नहीं रोकते; इसकी कीमत सफाई (VACUUM, तालिका-विस्तार) है।
इन तंत्रों को पिछले पाठों के पृथक्करण स्तरों और विसंगतियों के साथ जोड़कर आप समवर्तीता पर होने वाले पूरे साक्षात्कार को शुरू से अंत तक संभाल सकते हैं।
एआई शिक्षक के साथ कोडिंग साक्षात्कार की तैयारी सीखें — निःशुल्क
अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।
- पाठ्यक्रम
- 90
- पाठ
- 360
अक्सर पूछे जाने वाले प्रश्न
क्या “डेडलॉक, लॉकिंग और MVCC” पाठ निःशुल्क है?
हाँ—“डेडलॉक, लॉकिंग और MVCC” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और कोडिंग साक्षात्कार की तैयारी पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। कोडिंग साक्षात्कार की तैयारी पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
“डेडलॉक, लॉकिंग और MVCC” में मैं क्या सीखूँगा?
डेटाबेस टकरावों से कैसे बचते हैं और लॉकिंग बनाम स्नैपशॉट के बीच के समझौते आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ कोडिंग साक्षात्कार की तैयारी का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।
क्या कोडिंग साक्षात्कार की तैयारी शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?
पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर कोडिंग साक्षात्कार की तैयारी शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 4वाँ पाठ है।
“डेडलॉक, लॉकिंग और MVCC” पाठ पूरा करने में कितना समय लगता है?
CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।
क्या मैं इस कोडिंग साक्षात्कार की तैयारी पाठ में कोड लिख और चला सकता हूँ?
हाँ। हर कोडिंग साक्षात्कार की तैयारी पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।
इस पाठ्यक्रम के सभी पाठ
- ACID गुणों की व्याख्या
- पृथक्करण के चार स्तर
- डर्टी, नॉन-रिपीटेबल और फैंटम रीड
- डेडलॉक, लॉकिंग और MVCC