Згідно з документами:
СУЧАСНО Оновіть матеріалізований вигляд, не вимикаючи паралельно вибрані в матеріалізованому поданні. (...)
... ІНШІ ЗМІСТ ...
Навіть при такому варіанті лише один ПОВТОРЕННЯ одночасно може протистояти будь-якому матеріалізованому виду .
У мене була функція, яка перевіряла час останнього оновлення на МАТЕРІАЛІЗОВАНИЙ ВИДІЛ, і якщо минуло б більше 60 секунд, оновило б його.
Однак, що буде, якщо я спробую оновити матеріалізований погляд з двох окремих процесів одночасно? вони б стояли в черзі чи вони піднімуть помилку?
Чи є спосіб виявити, коли МАТЕРІАЛІЗОВАНИЙ ВИДІЛЬ оновлюється, і тому уникати його торкання?
В даний час я вдавався , щоб заповнити запис таблиці перед оновленням (настройка 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;
Однак я не впевнений, що освіжаючий прапор оновлюється синхронно (я маю на увазі, він дійсно чекає, коли оновлення дійсно буде повним)
Цей підхід раціональний чи я щось тут пропускаю?