문서에 따르면 :
구체화 된 뷰에서 동시 선택을 잠그지 않고 구체화 된 뷰를 새로 고칩니다. (...)
... 다른 내용 ...
이 옵션을 사용하더라도 한 번에 하나의 REFRESH 만 하나의 구체화 된보기 에 대해 실행될 수 있습니다 .
나는 했다 구체화 된보기의 마지막 새로 고침 시간을 확인하는 기능을하고 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
true 인 경우 구체화 된보기를 새로 고치려고하지 마십시오.
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;
그러나 새로 고침 플래그가 동 기적으로 업데이트되고 있는지 확실하지 않습니다 (새로 고침이 실제로 새로 고침이 끝날 때까지 기다립니다)
이 접근법이 합리적입니까, 아니면 여기에 뭔가 빠졌습니까?