किसी के लिए भी गुगली करना और यह समझने की कोशिश करना कि उनकी ड्रॉप टेबल (या विदेशी कुंजी ड्रॉप या विदेशी कुंजी जोड़ें) लंबे समय तक क्यों अटकी रही:
पोस्टग्रेएसक्यूएल (मैंने संस्करण 9.4 से 13 तक देखा) विदेशी कुंजी बाधाओं को वास्तव में विदेशी कुंजी के दोनों सिरों पर ट्रिगर का उपयोग करके कार्यान्वित किया जाता है ।
यदि आपके पास एक कंपनी तालिका (प्राथमिक कुंजी के रूप में आईडी) और एक bank_account तालिका (प्राथमिक कुंजी के रूप में आईडी, company_id विदेशी कुंजी के रूप में company.id की ओर इशारा करती है), तो वास्तव में bank_account तालिका पर 2 ट्रिगर होते हैं और कंपनी पर 2 ट्रिगर भी होते हैं टेबल।
टेबल_नाम | <थ>समय <थ>ट्रिगर_नामfunction_name | ||
---|---|---|---|
बैंक_खाता | अद्यतन के बाद | RI_ConstraintTrigger_c_1515961 | RI_FKey_check_upd |
बैंक_खाता | सम्मिलित करने के बाद | RI_ConstraintTrigger_c_1515960 | RI_FKey_check_ins |
कंपनी | अद्यतन के बाद | RI_ConstraintTrigger_a_1515959 | RI_FKey_noaction_upd |
कंपनी | हटाने के बाद | RI_ConstraintTrigger_a_1515958 | RI_FKey_noaction_del |
उन ट्रिगर्स के प्रारंभिक निर्माण (फोरिंग की बनाते समय) के लिए उन टेबलों पर SHARE ROW EXCLUSIVE लॉक की आवश्यकता होती है (यह संस्करण 9.4 और इससे पहले के संस्करण में एक्सेस एक्सक्लूसिव लॉक हुआ करता था)। यह लॉक "डेटा रीडिंग लॉक" के साथ विरोध नहीं करता है, लेकिन अन्य सभी लॉक के साथ संघर्ष करेगा, उदाहरण के लिए कंपनी तालिका में एक साधारण INSERT/UPDATE/DELETE।
उन ट्रिगर्स को हटाने (विदेशी कुंजी, या पूरी तालिका को छोड़ते समय) को उन तालिकाओं पर एक्सेस एक्सक्लूसिव लॉक की आवश्यकता होती है। यह लॉक हर दूसरे लॉक से टकराता है!
तो एक परिदृश्य की कल्पना करें, जहां आपके पास लेनदेन ए चल रहा है, जिसने पहले कंपनी तालिका से एक साधारण चयन किया था (जिससे लेनदेन शुरू होने या वापस लुढ़कने तक कंपनी तालिका के लिए एक्सेस शेयर लॉक रखने का कारण बनता है) और अब कुछ अन्य काम कर रहा है 3 मिनट। आप लेन-देन B में bank_account तालिका को छोड़ने का प्रयास करते हैं। इसके लिए ACCESS EXCLUSIVE लॉक की आवश्यकता होती है, जिसे पहले ACCESS SHARE लॉक जारी होने तक प्रतीक्षा करने की आवश्यकता होगी। इसके अलावा अन्य सभी लेन-देन, जो कंपनी तालिका तक पहुंचना चाहते हैं (बस चयन करें, या शायद INSERT/UPDATE/DELETE), ACCESS EXCLUSIVE लॉक पर प्रतीक्षा करने के लिए कतारबद्ध होगा, जो ACCESS SHARE लॉक पर प्रतीक्षा कर रहा है।
लंबे समय तक चलने वाले लेन-देन और डीडीएल परिवर्तनों के लिए नाजुक प्रबंधन की आवश्यकता होती है।