Theo các tài liệu:
QUAN TRỌNG Làm mới chế độ xem cụ thể hóa mà không khóa các lựa chọn đồng thời trên chế độ xem cụ thể hóa. (...)
... NỘI DUNG KHÁC ...
Ngay cả với tùy chọn này, chỉ một REFRESH tại một thời điểm có thể chạy với bất kỳ chế độ xem cụ thể hóa nào .
Tôi đã có một chức năng kiểm tra thời gian làm mới lần cuối để XEM VẬT LIỆU và, nếu hơn 60 giây trôi qua, nó sẽ làm mới nó.
Tuy nhiên, điều gì sẽ xảy ra nếu tôi cố gắng làm mới một cái nhìn cụ thể hóa từ hai quy trình riêng biệt cùng một lúc? họ sẽ xếp hàng hay họ sẽ đưa ra một lỗi?
Có cách nào để phát hiện khi XEM XEM VẬT LIỆU đang được làm mới và do đó tránh chạm vào nó không?
Hiện tại, tôi đã dùng đến việc tạo một bản ghi bảng trước khi làm mới (cài đặt refreshing
thành true
) và sau đó thiết lập nó false
khi quá trình kết thúc.
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;
Sau đó, bất cứ khi nào tôi gọi thủ tục này, tôi kiểm tra giá trị gần đây nhất last_update
và refreshing
giá trị của nó . Nếu refreshing
là đúng, thì đừng cố làm mới khung nhìn cụ thể hóa.
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;
Tuy nhiên, tôi không chắc chắn cờ làm mới đang được cập nhật đồng bộ (ý tôi là, nó thực sự chờ làm mới thực sự hoàn tất)
Cách tiếp cận này là hợp lý hay tôi đang thiếu một cái gì đó ở đây?