Secondo i documenti:
CONCORRENTE Aggiorna la vista materializzata senza bloccare le selezioni simultanee sulla vista materializzata. (...)
... ALTRI CONTENUTI ...
Anche con questa opzione, solo un AGGIORNAMENTO alla volta può essere eseguito su una vista materializzata .
Ho avuto una funzione che verifica l'ultimo tempo di aggiornamento per una vista materializzata e, se più di 60 secondi erano passati, sarebbe per aggiornarlo.
Tuttavia, cosa accadrebbe se provassi ad aggiornare una vista materializzata da due processi separati contemporaneamente? si metterebbero in coda o genererebbero un errore?
C'è un modo per rilevare quando una VISUALIZZAZIONE MATERIALIZZATA viene aggiornata e quindi evitare di toccarla?
Attualmente, ho fatto ricorso per popolare un record di tabella prima di aggiornare (impostazione refreshing
su true
) e quindi impostarlo su false
quando il processo è terminato.
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;
Quindi, ogni volta che chiamo questa procedura, controllo il più recente last_update
e il suo refreshing
valore. Se refreshing
è vero, allora non provare ad aggiornare la vista materializzata.
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;
Tuttavia, non sono sicuro che il flag di aggiornamento venga aggiornato in modo sincrono (voglio dire, aspetta davvero che l'aggiornamento sia effettivamente completato)
Questo approccio è razionale o mi sto perdendo qualcosa qui?