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

PostgreSQL में DROPping करते समय संदर्भित तालिकाओं पर अनन्य एक्सेस लॉक से बचें

किसी के लिए भी गुगली करना और यह समझने की कोशिश करना कि उनकी ड्रॉप टेबल (या विदेशी कुंजी ड्रॉप या विदेशी कुंजी जोड़ें) लंबे समय तक क्यों अटकी रही:

पोस्टग्रेएसक्यूएल (मैंने संस्करण 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 लॉक पर प्रतीक्षा कर रहा है।

लंबे समय तक चलने वाले लेन-देन और डीडीएल परिवर्तनों के लिए नाजुक प्रबंधन की आवश्यकता होती है।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. पोस्टग्रेएसक्यूएल को सी-फ़ंक्शंस के साथ विस्तारित करते समय उच्च-प्रदर्शन लेनदेन प्राप्त करना

  2. SQLITE SQL डंप फ़ाइल को POSTGRESQL में बदलें

  3. जावा का उपयोग करके PostgreSQL डेटाबेस को पुनर्स्थापित करें

  4. क्या मैं रन/सैंडबॉक्स एसक्यूएल कमांड को सुखा सकता हूं?

  5. विदेशी कुंजी प्रदर्शन द्वारा पोस्टग्रेज ऑर्डर?