De acordo com os documentos:
Atualize CONCORRENTE a vista materializada sem bloquear as opções simultâneas na vista materializada. (...)
... OUTROS CONTEÚDOS ...
Mesmo com essa opção, apenas uma atualização por vez pode ser executada em qualquer visualização materializada .
Eu tinha uma função que verificava o último tempo de atualização para uma VISÃO MATERIALIZADA e, se tivessem passado mais de 60 segundos, seria necessário atualizá-la.
No entanto, o que aconteceria se eu tentasse atualizar uma exibição materializada de dois processos separados ao mesmo tempo? eles colocariam na fila ou gerariam um erro?
Existe uma maneira de detectar quando uma VISTA MATERIALIZADA está sendo atualizada e, portanto, evitar tocá-la?
Atualmente, recorri ao preenchimento de um registro da tabela antes de atualizar (configurando refreshing
para true
) e depois defini-lo para false
quando o processo terminar.
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;
Então, sempre que chamo esse procedimento, verifico o mais recente last_update
e seu refreshing
valor. Se refreshing
for verdade, não tente atualizar a exibição materializada.
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;
No entanto, não tenho certeza se o sinalizador de atualização está sendo atualizado de forma síncrona (quero dizer, ele realmente aguarda a atualização ser concluída)
Essa abordagem é racional ou estou perdendo alguma coisa aqui?