कोई बग नहीं है, और मुझे नहीं लगता कि आप कुछ गलत समझ रहे हैं; आपको पहेली के कुछ टुकड़े याद आ रहे हैं।
पंक्ति-स्तरीय लॉकिंग का उपयोग करके विदेशी कुंजियों को आंतरिक रूप से कार्यान्वित किया जाता है; पोस्टग्रेज 8.1 से शुरू होकर 9.2 तक, जब भी आप संदर्भ तालिका को अपडेट करते हैं (apples
इस मामले में), एक क्वेरी निकाल दी जाती है जो SELECT FOR SHARE
. करता है संदर्भित तालिका पर (trees
) ताकि SELECT FOR UPDATE
पहले लेन-देन में SELECT FOR SHARE
. को ब्लॉक करता है दूसरे लेनदेन के लिए संदर्भात्मक अखंडता का। यही कारण है कि दूसरे कमांड में ब्लॉक हो जाता है।
अब मैं तुम्हें चिल्लाते हुए सुनता हूं, “रुको! यह दूसरे कमांड पर कैसे ब्लॉक हो जाता है और पहले नहीं? स्पष्टीकरण सरल है, वास्तव में - ऐसा इसलिए है क्योंकि एक सरल अनुकूलन है जो आंतरिक SELECT FOR SHARE
को छोड़ देता है जब कुंजी को संशोधित नहीं किया जा रहा है। हालांकि, यह इस मायने में सरल है कि यदि आप दूसरी बार टपल को अपडेट करते हैं, तो यह अनुकूलन सक्रिय नहीं होगा क्योंकि मूल मानों को ट्रैक करना कठिन है। इसलिए रुकावट।
आप भी सोच रहे होंगे कि मैंने ऐसा क्यों कहा कि यह 9.2 तक है --- 9.3 के साथ क्या है? मुख्य अंतर यह है कि 9.3 में यह SELECT FOR KEY SHARE
. का उपयोग करता है , जो एक नया, हल्का लॉक स्तर है; यह बेहतर संगामिति के लिए अनुमति देता है। यदि आप 9.3 में अपना उदाहरण आजमाते हैं और SELECT FOR UPDATE
. भी बदलते हैं करने के लिए SELECT FOR NO KEY UPDATE
(जो SELECT FOR UPDATE
. की तुलना में हल्का मोड है यह कहता है कि आप शायद टुपल को अपडेट करने जा रहे हैं, लेकिन आप प्राथमिक कुंजी को संशोधित नहीं करने का वादा करते हैं और इसे हटाने का वादा नहीं करते हैं), आपको यह देखना चाहिए कि यह ब्लॉक नहीं होता है। (इसके अलावा, आप संदर्भित पंक्ति पर एक अद्यतन का प्रयास कर सकते हैं और यदि आप प्राथमिक कुंजी को संशोधित नहीं करते हैं, तो यह भी अवरुद्ध नहीं होगा।)
यह 9.3 सामग्री आपके द्वारा एक पैच द्वारा सही मायने में पेश की गई थी http://git.postgresql.org/gitweb/?p=postgresql.git;a=commit;h=0ac5ad5134f2769ccbaefec73844f8504c4d6182 और मुझे लगता है कि यह एक बहुत अच्छा हैक था (यदि आप उस तरह की चीजों की परवाह करते हैं तो प्रतिबद्ध संदेश में कुछ और विवरण हैं)। लेकिन सावधान रहें, 9.3.4 से पहले के संस्करणों का उपयोग न करें क्योंकि वह पैच इतना जटिल था कि कुछ गंभीर बगों पर किसी का ध्यान नहीं गया और हमने हाल ही में इसे ठीक किया है।