आपके द्वारा वर्णित व्यवहार सामान्य है और किसी भी लेन-देन संबंधी संबंधपरक डेटाबेस में अपेक्षित है।
यदि PostgreSQL ने आपको edited
का मान दिखाया है पहले SELECT
. के लिए ऐसा करना गलत होगा - इसे "डर्टी रीड" कहा जाता है, और यह डेटाबेस में बुरी खबर है।
PostgreSQL को SELECT
. पर प्रतीक्षा करने की अनुमति दी जाएगी जब तक आप प्रतिबद्ध या वापस रोल नहीं करते हैं, लेकिन SQL मानक द्वारा इसकी आवश्यकता नहीं है, आपने यह नहीं बताया है कि आप प्रतीक्षा करना चाहते हैं, और इसे किसी तकनीकी कारण की प्रतीक्षा नहीं करनी है, इसलिए यह आपके द्वारा पूछे गए डेटा को वापस कर देता है तुरंत के लिए। आखिरकार, जब तक यह प्रतिबद्ध नहीं हो जाता, तब तक वह update
केवल तरह का अस्तित्व है - यह अभी भी हो सकता है या नहीं भी हो सकता है।
यदि PostgreSQL हमेशा यहां प्रतीक्षा करता है, तो आप जल्दी से ऐसी स्थिति में आ जाएंगे जहां एक समय में केवल एक कनेक्शन डेटाबेस के साथ कुछ भी कर सकता है। प्रदर्शन के लिए सुंदर नहीं है, और अधिकांश समय पूरी तरह से अनावश्यक है।
यदि आप समवर्ती UPDATE
की प्रतीक्षा करना चाहते हैं (या DELETE
), आप उपयोग करेंगे SELECT ... FOR SHARE
. (लेकिन ध्यान रखें कि यह INSERT
. के लिए काम नहीं करेगा )।
विवरण:
SELECT
बिना किसी FOR UPDATE
या FOR SHARE
क्लॉज कोई पंक्ति स्तर के ताले नहीं लेता है। तो यह देखता है कि वर्तमान प्रतिबद्ध पंक्ति जो भी है, और उस पंक्ति को संशोधित करने वाले किसी भी इन-फ्लाइट लेनदेन से प्रभावित नहीं है। अवधारणाओं को दस्तावेज़ के MVCC अनुभाग
में समझाया गया है . सामान्य विचार यह है कि पोस्टग्रेएसक्यूएल कॉपी-ऑन-राइट है, वर्जनिंग के साथ जो इसे लेन-देन या स्टेटमेंट के शुरू होने के समय "देख" सकता है, इसके आधार पर सही कॉपी वापस करने की अनुमति देता है - जिसे पोस्टग्रेएसक्यूएल "स्नैपशॉट" कहता है।पी>
डिफ़ॉल्ट में READ COMMITTED
आइसोलेशन स्नैपशॉट स्टेटमेंट स्तर पर लिए जाते हैं, इसलिए यदि आप SELECT
एक पंक्ति, COMMIT
किसी अन्य लेन-देन से इसमें परिवर्तन, और SELECT
यह फिर से आप एक ट्रांजेक्शन के भीतर भी अलग-अलग मान देखेंगे। आप SNAPSHOT
का उपयोग कर सकते हैं अलगाव यदि आप लेन-देन शुरू होने के बाद किए गए परिवर्तनों को नहीं देखना चाहते हैं, या SERIALIZABLE
कुछ प्रकार के लेन-देन की अंतर-निर्भरता के खिलाफ और सुरक्षा जोड़ने के लिए अलगाव।
देखें दस्तावेज़ीकरण में लेन-देन अलगाव अध्याय ।
अगर आप SELECT
चाहते हैं इन-प्रगति लेनदेन के लिए प्रतीक्षा करने के लिए या चयनित की जा रही पंक्तियों में परिवर्तन रोलबैक करने के लिए, आपको SELECT ... FOR SHARE
का उपयोग करना चाहिए . यह एक UPDATE
. द्वारा लिए गए लॉक पर ब्लॉक हो जाएगा या DELETE
जब तक लेन-देन जो लॉक को वापस ले लेता है या वापस ले लेता है।
INSERT
अलग है, हालांकि - प्रतिबद्ध होने तक टुपल्स अन्य लेनदेन के लिए मौजूद नहीं हैं। समवर्ती INSERT
. के लिए प्रतीक्षा करने का एकमात्र तरीका s एक EXCLUSIVE
लेना है टेबल-लेवल लॉक, ताकि आप जान सकें कि टेबल को पढ़ते समय कोई और नहीं बदल रहा है। आमतौर पर ऐसा करने की आवश्यकता का मतलब है कि आपको एप्लिकेशन में डिज़ाइन की समस्या है - हालांकि आपके ऐप को देखभाल नहीं करना चाहिए अगर कोई कमिटेड insert
हैं अभी भी उड़ान में है।
देखें दस्तावेज़ीकरण का स्पष्ट लॉकिंग चैप्टर ।