यदि कनेक्शन खो गया है / टूट गया है तो क्या पोस्टग्रेज लंबे समय तक चलने वाली क्वेरी को निरस्त कर दिया गया है?


20

अगर मैं Postgres का कनेक्शन खोलता हूं और एक लंबी-चलने वाली क्वेरी जारी करता हूं, और फिर कनेक्शन को तोड़ता हूं (जैसे, कनेक्शन को खोलने वाली क्लाइंट प्रक्रिया को मारता हूं), तो क्या लंबे समय तक चलने वाली क्वेरी चलती रहेगी, या यह स्वचालित रूप से निरस्त हो जाएगी? क्या यह विन्यास योग्य है?

(मैं Postgresql 9.2.9 का उपयोग कर रहा हूं)

जवाबों:


32

"निर्भर करता है"।

यदि क्लाइंट नेटवर्क कनेक्शन हानि के कारण गायब हो जाता है, तो क्वेरी आमतौर पर तब तक चलेगी जब तक कि उसके नेटवर्क भेजने वाले बफर को भरने के लिए पर्याप्त पंक्तियों को पुनर्प्राप्त नहीं किया जाता है, तब रुकें और टीसीपी कनेक्शन ड्रॉप होने तक अटक जाएं, जिस बिंदु पर यह गर्भपात करेगा। यदि यह टीसीपी भेजने वाले बफर को भरने से पहले इसे पूरा कर लेता है, तो यह सफलतापूर्वक पूरा हो जाएगा, इसलिए यदि यह क्वेरी स्वतः पूर्ण हो जाएगी।

यदि क्लाइंट को इस तरह से मार दिया जाता है कि क्लाइंट का ऑपरेटिंग सिस्टम टीसीपी RST (जैसे क्लाइंट सेगफॉल्ट / क्रैश, SIGTERM, SIGKILL, आदि) के माध्यम से सर्वर को रिपोर्ट कर सकता है, तो PostgreSQL सर्वर इंटरप्ट फ्लैग सेट करेगा। अगली बार जब आप इसे निष्पादित करते हैं, तो यह ध्वज और गर्भपात को देखेगा। कभी-कभी एक क्वेरी कोड के भीतर सीपीयू-भारी काम कर रही हो सकती है जो इंटरप्ट के लिए जांच नहीं करती है - कुछ एक्सटेंशन, और पोस्टग्रेसीक्यू कोर के भीतर कुछ स्थान - जिस स्थिति में यह लंबे समय तक रुकावट को नोटिस नहीं कर सकता है और चालू रह सकता है। यह बहुत ही हमेशा रुकावट और गर्भपात को देखने से पहले पूरा करेगा और अगर यह ऑटोकॉमिट है, तो कमिटिंग।

यदि क्लाइंट को अचानक OS रिबूट की तरह कुछ द्वारा मार दिया जाता है, ताकि क्लाइंट होस्ट को अचानक टीसीपी कनेक्शन के बारे में कुछ भी पता न चले, लेकिन फिर भी नेटवर्क पर प्रतिक्रिया दे सकता है, तो संभवतः पंक्ति को लिखने के लिए क्वेरी पहली बार निरस्त हो जाएगी, जैसे जेफ ने कहा, क्योंकि क्लाइंट का होस्ट रिबूट के बाद सर्वर द्वारा भेजे गए पहले पैकेट के जवाब में एक टीसीपी आरएसटी भेजेगा। PostgreSQL द्वारा भेजे जाने वाली प्रत्येक पंक्ति में व्यवधान की जाँच करता है।

यह व्यवहार कॉन्फ़िगर करने योग्य नहीं है। जहां तक ​​अगर ग्राहक चला गया है तो किसी भी प्रश्न को समाप्त करने के लिए PostgreSQL का संबंध है, अगर ग्राहक चला जाता है। यह बदलने के लिए कि आपको किसी प्रकार के क्वेरी पूर्ण टोकन की आवश्यकता होगी, जिसे आप क्वेरी प्रारंभ में प्राप्त कर सकते हैं, फिर बाद में अपने कनेक्शन के माध्यम से क्वेरी के बारे में सर्वर से पूछने के लिए उपयोग करें। अनिवार्य रूप से आपको अतुल्यकालिक / पृष्ठभूमि प्रश्नों को लागू करना होगा। संभवतः एक अच्छी सुविधा है, लेकिन वर्तमान में समर्थित नहीं है।

यदि क्वेरी स्वतः पूर्ण है, या यदि आपकी क्वेरी COMMITउस समय की उड़ान थी, जब आपने क्लाइंट को मार दिया था / कनेक्शन खो दिया था, तो लेन-देन एक अनिश्चित स्थिति में होना संभव है, जहां क्लाइंट को पता नहीं है कि या यह प्रतिबद्ध नहीं है। डेटा पर लेनदेन के प्रभावों की तलाश के अलावा, इसका कोई वास्तविक तरीका नहीं है।

जहां यह अस्वीकार्य है आप दो चरण प्रतिबद्ध और एक क्लाइंट-साइड लेनदेन प्रबंधक का उपयोग कर सकते हैं ।


1
वाह, बस मैं क्या देख रहा था, एक उत्कृष्ट विस्तृत जवाब! धन्यवाद @ क्रेग_रिंगर!
बजे रोब बेडनार्क


2

यह तब तक चलता रहेगा जब तक यह कनेक्शन को पंक्तियों को वापस करने की कोशिश नहीं करता है और टूटने का पता लगाता है। तो किसी भी पंक्तियों को वापस करने से पहले सभी काम करने वाली क्वेरी के लिए, यह अनिवार्य रूप से पूरा होने तक चलेगा।


साभार @jjanes क्या आप इसे इंगित करने वाले किसी दस्तावेज़ या स्रोत कोड की ओर संकेत कर सकते हैं?
रोब बेडनार्क
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.