डॉक्स के अनुसार:
संक्षेप में भौतिकवादी दृश्य पर समवर्ती चयन को लॉक किए बिना भौतिकीकृत दृश्य को ताज़ा करें। (...)
... अन्य सामग्री ...
यहां तक कि इस विकल्प के साथ एक समय में केवल एक ही आरईएफआरईएसएच किसी भी भौतिक दृष्टिकोण के खिलाफ चल सकता है ।
मेरे पास एक फ़ंक्शन था जो एक अंतिम दृश्य के लिए अंतिम ताज़ा समय की जाँच करता है और, यदि 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;
हालाँकि, मुझे यकीन नहीं है कि ताज़ा झंडे को सिंक्रोनाइज़ किया जा रहा है (मेरा मतलब है, यह वास्तव में ताज़ा होने का इंतज़ार करता है)
क्या यह दृष्टिकोण तर्कसंगत है या मैं यहां कुछ याद कर रहा हूं?