SQL Academy · पाठ

डेडलॉक: पहचान और बचाव

समझें कि डेडलॉक कैसे होते हैं, Postgres उन्हें कैसे पहचानता है और उनसे बचने वाले लॉक-क्रम नियम कैसे डिज़ाइन करें

पाठ 3, कुल 4 में से14 चरण

डेडलॉक: पहचान और बचाव, CoddyKit पर SQL Academy का एक निःशुल्क पाठ है। यह 4 में से 3वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह SQL Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। SQL Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

डेडलॉक क्या है

दो लेन-देन में से प्रत्येक के पास वह लॉक होता है जो दूसरे को चाहिए — इसलिए कोई भी आगे नहीं बढ़ सकता। डेटाबेस इस चक्र का पता लगाकर एक लेन-देन को निरस्त कर देता है।

एक सामान्य डेडलॉक

Tx A पंक्ति 1 पर लॉक लगाता है और Tx B पंक्ति 2 पर। A पंक्ति 2 माँगता है और B पंक्ति 1 माँगता है। दोनों अटक जाते हैं।

-- Tx A:
BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
-- waiting for B...

-- Tx B:
BEGIN;
UPDATE accounts SET balance = balance - 50 WHERE id = 2;
UPDATE accounts SET balance = balance + 50 WHERE id = 1;
-- waiting for A...

-- ERROR: deadlock detected

PostgreSQL डेडलॉक का पता लगाता है

हर deadlock_timeout (डिफ़ॉल्ट 1 सेकंड) के बाद PostgreSQL लॉक-चक्रों की जाँच करता है। चक्र मिलने पर यह त्रुटि कोड 40P01 के साथ एक लेन-देन को निरस्त कर देता है।

ERROR:  deadlock detected
DETAIL:  Process 1234 waits for ShareLock on transaction 5678 ...

लॉक-क्रम का नियम

उपाय: सभी कोड-पथों में हमेशा एक ही क्रम में लॉक प्राप्त करें।

-- Always update the lower id first:
UPDATE accounts SET balance = balance - 100 WHERE id = LEAST(:from, :to);
UPDATE accounts SET balance = balance + 100 WHERE id = GREATEST(:from, :to);

अधिक-प्रयुक्त पंक्ति के डेडलॉक

उन्हीं अधिक-प्रयुक्त पंक्तियों में तेज़ी से किए गए अद्यतन अक्सर डेडलॉक के बजाय लॉक-प्रतीक्षा उत्पन्न करते हैं। कतार का उपयोग करें, अधिक-प्रयुक्त पंक्ति का विभाजन करें, या ऐप कोड में अद्यतनों को क्रमबद्ध करें।

FOR UPDATE पढ़ी गई पंक्तियों पर लॉक लगाता है

बाद में होने वाले अप्रत्याशित परिणामों से बचने के लिए पढ़ते समय ही लेखन-लॉक प्राप्त करें:

BEGIN;
SELECT * FROM accounts WHERE id IN (1, 2) ORDER BY id FOR UPDATE;
-- both rows locked in id order
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
COMMIT;

लॉक की गई पंक्तियों को छोड़ना

कतार वाली तालिकाओं के लिए "कोई भी उपलब्ध पंक्ति प्राप्त करें" का तरीका:

SELECT * FROM jobs
WHERE status = 'pending'
ORDER BY created_at
LIMIT 1
FOR UPDATE SKIP LOCKED;
-- skips rows other workers have locked

NOWAIT

प्रतीक्षा करने के बजाय तुरंत विफल हों:

SELECT * FROM accounts WHERE id = 1 FOR UPDATE NOWAIT;
-- ERROR: could not obtain lock on row in relation "accounts"

डेडलॉक का निदान

log_lock_waits को बढ़ाएँ और लॉग में डेडलॉक का संदर्भ दर्ज करें। लॉग प्रविष्टि दोनों लेन-देन और उनके query दिखाती है।

ऐप का पुनः प्रयास लूप

डेडलॉक से उबरा जा सकता है — निरस्त किए गए लेन-देन का फिर से प्रयास करें:

for (let attempt = 0; attempt < 3; attempt++) {
  try {
    await runTransaction();
    break;
  } catch (e) {
    if (e.code === '40P01') continue;     // deadlock
    throw e;
  }
}

लॉक का दायरा घटाना

लेन-देन छोटे रखें — छुई गई प्रत्येक पंक्ति COMMIT होने तक लॉक रहती है। लेन-देन के भीतर HTTP कॉल या लंबी गणना न करें।

लॉक बढ़ने से बचने के लिए विदेशी कुंजियों पर अनुक्रमणिका बनाएँ

जब आप किसी मूल पंक्ति को हटाते हैं, तो प्रत्येक आश्रित पंक्ति की जाँच की जाती है। FK की अनुक्रमणिका न होने पर पूरी तालिका को स्कैन करना पड़ता है AND पंक्ति-लॉक भी लगते हैं। हर FK स्तंभ पर अनुक्रमणिका बनाएँ।

पुनरावलोकन

डेडलॉक होते हैं — उन्हें कम करने के लिए डिज़ाइन करें।

  • लॉक एक सुसंगत क्रम में प्राप्त करें
  • अपना इरादा पहले बताने के लिए FOR UPDATE का जल्दी उपयोग करें
  • कतारों के लिए SKIP LOCKED
  • डेडलॉक त्रुटियों (40P01) पर पुनः प्रयास करें
  • लेन-देन छोटे रखें

त्वरित जाँच

डेडलॉक रोकने के लिए सबसे विश्वसनीय डिज़ाइन सिद्धांत क्या है?

शुरुआत निःशुल्क

एआई शिक्षक के साथ SQL सीखें — निःशुल्क

अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।

पाठ्यक्रम
46
पाठ
183

अक्सर पूछे जाने वाले प्रश्न

क्या “डेडलॉक: पहचान और बचाव” पाठ निःशुल्क है?

हाँ—“डेडलॉक: पहचान और बचाव” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और SQL Academy पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। SQL Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

“डेडलॉक: पहचान और बचाव” में मैं क्या सीखूँगा?

समझें कि डेडलॉक कैसे होते हैं, Postgres उन्हें कैसे पहचानता है और उनसे बचने वाले लॉक-क्रम नियम कैसे डिज़ाइन करें आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ SQL Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।

क्या SQL Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?

पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर SQL Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 3वाँ पाठ है।

“डेडलॉक: पहचान और बचाव” पाठ पूरा करने में कितना समय लगता है?

CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।

क्या मैं इस SQL Academy पाठ में कोड लिख और चला सकता हूँ?

हाँ। हर SQL Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।

इस पाठ्यक्रम के सभी पाठ

  1. ACID गुण और विसंगतियाँ
  2. पृथक्करण स्तर: READ COMMITTED, REPEATABLE READ, SERIALIZABLE
  3. डेडलॉक: पहचान और बचाव
  4. आशावादी बनाम निराशावादी लॉकिंग
← SQL Academy पर वापस जाएँ