ตามเอกสาร:
รีเฟรชมุมมองที่เป็นรูปธรรมอย่างไม่หยุดยั้งโดยไม่ล็อคออกพร้อมกันเลือกบนมุมมองที่ปรากฏ ( ... )
... เนื้อหาอื่น ๆ ...
แม้จะมีตัวเลือกนี้REFRESH ครั้งละหนึ่งอาจทำงานกับ มุมมองที่ปรากฏขึ้นใด ๆ
ฉันมีฟังก์ชั่นที่ตรวจสอบเวลารีเฟรชครั้งล่าสุดสำหรับ VIEW MATERIALIZED และถ้าผ่านไป 60 วินาทีมันจะรีเฟรช
อย่างไรก็ตามจะเกิดอะไรขึ้นหากฉันพยายามรีเฟรชมุมมองที่เป็นรูปธรรมจากกระบวนการที่แยกกันสองกระบวนการในเวลาเดียวกัน พวกเขาจะจัดคิวหรือจะเพิ่มข้อผิดพลาดหรือไม่
มีวิธีการตรวจจับหรือไม่เมื่อมุมมองแบบ MATERIALIZED กำลังถูกรีเฟรชและหลีกเลี่ยงการสัมผัส
ขณะนี้ฉันได้ทำการเติมข้อมูลในตารางก่อนที่จะรีเฟรช (ตั้งค่า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;
อย่างไรก็ตามฉันไม่แน่ใจว่าการตั้งค่าสถานะการรีเฟรชได้รับการอัปเดตแบบซิงโครนัส (ฉันหมายถึงมันจะรอให้การรีเฟรชเสร็จสมบูรณ์จริง ๆ )
นี่เป็นวิธีการที่มีเหตุผลหรือฉันขาดอะไรที่นี่ไหม?