यदि एक ही समय में दो प्रक्रियाएं पुन: प्रमाणित होने का प्रयास करें तो क्या होता है?


13

डॉक्स के अनुसार:

संक्षेप में भौतिकवादी दृश्य पर समवर्ती चयन को लॉक किए बिना भौतिकीकृत दृश्य को ताज़ा करें। (...)

... अन्य सामग्री ...

यहां तक ​​कि इस विकल्प के साथ एक समय में केवल एक ही आरईएफआरईएसएच किसी भी भौतिक दृष्टिकोण के खिलाफ चल सकता है

मेरे पास एक फ़ंक्शन था जो एक अंतिम दृश्य के लिए अंतिम ताज़ा समय की जाँच करता है और, यदि 60 सेकंड से अधिक समय बीत चुका है, तो इसे ताज़ा करना होगा।

हालाँकि, अगर मैं एक ही समय में दो अलग-अलग प्रक्रियाओं से भौतिक दृष्टिकोण को ताज़ा करने की कोशिश करूँ तो क्या होगा? क्या वे कतार लगाएंगे या वे कोई त्रुटि उठाएंगे?

क्या पता लगाने का कोई तरीका है कि जब MATERIALIZED VIEW रीफ्रेश किया जा रहा है और इसलिए इसे छूने से बचें?

वर्तमान में, मैंने रिफ्रेश (सेटिंग ) करने refreshingसे पहले एक टेबल रिकॉर्ड को पॉप्युलेट करने के लिए सहारा लिया है trueऔर फिर इसे तब सेट किया है falseजब प्रक्रिया समाप्त हो गई है।

EXECUTE 'INSERT INTO refresh_status (last_update, refreshing) 
         VALUES (clock_timestamp(), true) RETURNING id') INTO refresh_id;
EXECUTE 'REFRESH MATERIALIZED VIEW CONCURRENTLY my_mat_view';
EXECUTE 'UPDATE refresh_status SET refreshing=false WHERE id=$1' USING refresh_id;

फिर, जब भी मैं इस प्रक्रिया को कहता हूं, मैं सबसे हाल ही में last_updateऔर उसके refreshingमूल्य की जांच करता हूं । अगर refreshingयह सच है, तो भौतिकवादी दृष्टिकोण को ताज़ा करने की कोशिश मत करो।

EXECUTE 'SELECT 
           extract(epoch FROM now() - (last_update))::integer, 
           refreshing
         FROM refresh_status
         ORDER BY last_update DESC
         LIMIT 1' INTO update_seconds_ago, refreshing;

IF(updated_seconds_ago > 60 AND refreshing = FALSE) THEN
  -- the refresh block above
END IF;

हालाँकि, मुझे यकीन नहीं है कि ताज़ा झंडे को सिंक्रोनाइज़ किया जा रहा है (मेरा मतलब है, यह वास्तव में ताज़ा होने का इंतज़ार करता है)

क्या यह दृष्टिकोण तर्कसंगत है या मैं यहां कुछ याद कर रहा हूं?

जवाबों:


13

के रूप में में वर्णित इस उत्तर , " REFRESH MATERIALIZED VIEW CONCURRENTLYएक लेता है EXCLUSIVEमेज पर ताला"। दस्तावेज़ीकरण के लिए खराब निशान के बाद हम पढ़ सकते हैं कि EXCLUSIVEएक मेज पर ताला "केवल समवर्ती ACCESS SHAREताले की अनुमति देता है , अर्थात, केवल तालिका से पढ़ता है आगे बढ़ सकता है"। उसी पैराग्राफ में हम देख सकते हैं कि " EXCLUSIVEके साथ संघर्ष ... EXCLUSIVE", जिसका अर्थ है कि एक और REFRESH MATERIALIZED VIEW CONCURRENTLYबयान, जो एक ही EXCLUSIVEलॉक का अनुरोध करता है , उसे पहले EXCLUSIVEलॉक जारी होने तक इंतजार करना होगा ।

यदि आप अपरिभाषित अवधि के लिए इस लॉक के इंतजार से बचना चाहते हैं, तो आप सत्र चरlock_timeout को समझदार मूल्य पर सेट करना चाह सकते हैं ।


पुनश्च: क्या आपको लगता है कि समवर्ती (कोई दंडित इरादा नहीं) प्रयासों को बताने के लिए इस अपरिचित तालिका को रखने का कोई मतलब है कि MAT VIEW व्यस्त है और इसलिए इसे ताज़ा होने की आवश्यकता होने पर भी अकेला छोड़ दिया जाना चाहिए?
ffflabs

यह राय का विषय है; अगर आपको लगता है कि इससे आपको अपने तर्क रखने में मदद मिल सकती है। ध्यान दें, हालांकि, आपका कार्य दौड़ की स्थिति के अधीन है और इसलिए 100% विश्वसनीय नहीं है।
मस्टीको

क्या आपको लगता है कि यह pg_locks पर जांचना व्यवहार्य है, यह देखने के लिए कि क्या कोई चटाई दृश्य देख रहा है?
ffflabs

फिर से, दौड़ की स्थिति संभव है: एक मौका है कि आप के बीच एक ताला लगा दिया जाएगा pg_locksऔर जांच शुरू करें। लॉक संघर्ष को संबोधित करने का एक उचित तरीका समय-समय पर सेट करना और त्रुटि को संभालना है।
मस्टीको

3

जैसा कि मस्टीको द्वारा नोट किया गया है , यह सवाल पोस्टग्रेज रिफ्रेश्ड मैटेरियलाइज्ड व्यू लॉक्स के साथ काफी हद तक ओवरलैप करता है ।

हालाँकि, जबकि उस प्रश्न के स्वीकृत उत्तर में एक लिंक है जो इस एक का उत्तर देता है, इस प्रश्न का उत्तर सीधे उस एक में शामिल नहीं है।

तो, विशिष्ट होने के लिए: स्पष्ट लॉकिंग पर PostgreSQL मैनुअल पेज के अनुसार (लिंक वर्तमान संस्करण पृष्ठ के लिए है, पोस्टग्रेज 10 के लिए), REFRESH MATERIALIZED VIEW CONCURRENTLYएक EXCLUSIVEताला लेता है । EXCLUSIVEताला अन्य सभी ताले को ब्लॉक करने के लिए प्रकट होता है को छोड़कर ACCESS SHARE अन्य शामिल है कि - EXCLUSIVEताले।

तो REFRESH MATERIALIZED VIEW CONCURRENTLYउसी दृश्य पर एक दूसरा अनुरोध पहले रिलीज़ होने के लिए प्राप्त लॉक का इंतजार करेगा।


धन्यवाद। मैंने अभी भी @ mustaccio के उत्तर को स्वीकार किया क्योंकि उन्होंने अपने पाठ को मेरे प्रश्न के अधिक विशिष्ट होने के लिए संपादित किया।
ffflabs

0

Mustaccio और RDFozz के जवाबों के लिए धन्यवाद , मैं अंत में समझ गया कि REFRESH ... CONCURRENTLYएक विशेष ताला लेना वह कारण है जिसके लिए Postgretel प्रलेखन कहता है :

यहां तक ​​कि इस विकल्प के साथ एक समय में केवल एक ही आरईएफआरईएसएच किसी भी भौतिक दृष्टिकोण के खिलाफ चल सकता है

मुझे डर था कि इसका मतलब यह था कि साथ-साथ रिफ्रेश करने का कोई भी प्रयास एक त्रुटि पैदा करेगा , लेकिन उनके जवाबों के प्रकाश में, कोई भी त्रुटि शामिल नहीं है। यह सिर्फ ताले की बात है जो एक साथ प्रयासों को लागू करेगा। इसलिए दस्तावेज़ीकरण की व्याख्या इस प्रकार की जा सकती है:

इस ऑपरेशन के दौरान अधिग्रहित ताला MATERIALIZED VIEW से पढ़ने के अलावा किसी भी ऑपरेशन को रोक देगा। REFRESH करते समय Materialized View को रिफ्रेश करने के आगे के प्रयास ... पहला लॉक जारी होने तक CONCURRENTLY चल रहा है।

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