Postgresql में गतिरोध से निपटना

एक आदर्श उत्पादन वातावरण में, हम सभी को एक ऐसी स्थिति का सामना करना पड़ता है जहाँ हम अपने डेटाबेस से गतिरोध प्राप्त करते हैं। आपकी तालिका के गतिरोध के पीछे कई कारण हो सकते हैं। हम कुछ परिदृश्यों और संभावित गतिरोधों को संभालने के माध्यम से जाएंगे।

परिदृश्य 1: सबसे आम परिदृश्य।

थ्रेड 1: अपडेट कर्मचारी सेट नाम = 'राम' जहां आईडी = 1

→ यह कथन उस पंक्ति को लॉक करता है जहाँ id = 1 है

थ्रेड 2: अपडेट कर्मचारी सेट नाम = 'आकाश' जहां आईडी = 2

→ यह कथन उस पंक्ति को लॉक करता है जहाँ id = 2 है

थ्रेड 1: अपडेट कर्मचारी सेट नाम = 'prasanna' जहां id = 2

→ यह कथन इस पंक्ति पर लॉक प्राप्त करने का प्रयास करेगा, लेकिन यह तब से नहीं हो सकता जब तक कि थ्रेड 2 द्वारा पहले से ही लॉक नहीं बनाया गया हो। इसलिए, यह लॉक जारी करने के लिए थ्रेड 2 की प्रतीक्षा करेगा।

थ्रेड 2: अपडेट कर्मचारी सेट नाम = 'प्रशाँत' जहाँ आईडी = 1

→ यह कथन इस पंक्ति पर लॉक प्राप्त करने का प्रयास करेगा, लेकिन यह नहीं हो सकता क्योंकि लॉक को थ्रेड 1 द्वारा पहले ही बना दिया गया है। इसलिए, यह थ्रेड 1 को लॉक जारी करने के लिए इंतजार करेगा, जो कभी नहीं होगा, क्योंकि दोनों एक-दूसरे के खिलाफ लॉक पकड़े हुए हैं, एक गतिरोध पैदा कर रहा है।

परिदृश्य 2:

जबकि एक ही अनुरोध को समवर्ती रूप से संभालना।

धागा 1:

अद्यतन कर्मचारी सेट भूमिका = 'देव' जहां ('राम', 'प्रशान्त', 'आकाश') में नाम

→ क्लॉज में निर्दिष्ट क्रम में अद्यतन को निष्पादित करने की आवश्यकता नहीं है। उदाहरण के लिए, उपरोक्त कथन निम्नलिखित क्रम में अद्यतन को निष्पादित कर सकता है 'प्रशान्त', 'आकाश', 'राम'।

धागा 2:

अद्यतन कर्मचारी सेट भूमिका = 'देव' जहां ('राम', 'प्रशान्त', 'आकाश') में नाम

→ थ्रेड 1 से समान स्थिति यहां लागू होती है और उपरोक्त कथन इस क्रम में क्वेरी को निष्पादित कर सकता है → 'राम', 'प्रशान्त', 'आकाश'

तो समस्या क्या है ?

थ्रेड 1, पहले उस पंक्ति को लॉक करता है जहाँ नाम = 'प्रशाँत' और थ्रेड 2, पंक्ति को जहाँ नाम = 'राम' को लॉक करता है, हमें फिर से एक डेडलॉक मिलेगा क्योंकि स्टेटमेंट का अगला सेट लॉक जारी करने के लिए इनमें से प्रत्येक लेनदेन पर निर्भर करेगा।

हम कैसे गतिरोध को संभाल सकते हैं?

PostgreSQL में, हमारे पास एक बार में लेन-देन के अंदर सभी पंक्तियों को लॉक करने का विकल्प होता है और लेनदेन होने के बाद सभी को एक बार जारी किया जाता है।

आइए एक उदाहरण लें कि हम वास्तव में ऐसा कैसे कर सकते हैं,

शुरू;

कर्मचारी से 1 का चयन करें जहां आईडी (1,2,3) में अद्यतन के लिए;

अद्यतन कर्मचारी सेट भूमिका = 'देव' जहां ('राम', 'प्रशान्त', 'आकाश') में नाम;

समाप्त;

UPDATE के लिए SELECT… का उपयोग करते हुए सभी पंक्तियों पर लॉक को एक ही बार में निर्दिष्ट किया जाएगा, जहां लेन-देन पूरा होने के बाद एक बार लॉक जारी करना होगा। कूल है ना :)

कृपया चयन के लिए सतर्क रहें ... अद्यतन के लिए क्योंकि यह विदेशी कुंजी कॉलम और संदर्भ तालिका पर प्रभाव डालता है। यदि मामले में, संदर्भित तालिका में विशेष रूप से संदर्भित फ़ील्ड में परिवर्तन होता है, तो यह तब तक लॉक रहेगा जब तक लेनदेन नहीं किया जाता है।

इस ब्लॉग को पढ़ने के लिए धन्यवाद। आशा करता हूँ की ये काम करेगा :)