Dokümanlara göre:
SONUÇLAR Malzeme görünümünde eşzamanlı seçimleri kilitlemeden materyal görünümünü yenileyin. (...)
... DİĞER İÇERİKLER ...
Bu seçenekle bile, somutlaştırılmış herhangi bir görüşe karşı aynı anda yalnızca bir YENİLEME gerçekleştirilebilir .
Ben vardı gerçekleşen bakış için son yenileme süresi kontrol işlevi ve 60'dan fazla saniye geçmişti eğer, onu yenilemek için olur.
Ancak, aynı anda iki ayrı işlemden gerçekleşen bir görünümü yenilemeye çalışırsam ne olur? sıraya koyacaklar mı yoksa bir hata mı yapacaklar?
MALZEMELİ BİR GÖRÜNÜMün ne zaman yenilendiğini tespit etmenin ve dolayısıyla dokunmaktan kaçınmanın bir yolu var mı?
Şu anda, (ayar yenilemeden önce bir tablo rekor doldurmak için başvurdular refreshing
için true
) ve daha sonra bunu ayarı false
işlemi tamamlandığında.
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;
Sonra, bu prosedürü her çağırışımda, en son last_update
ve refreshing
değerini kontrol ederim . Eğer refreshing
doğruysa, o zaman materialized görünümü yenilemek için çalışmayın.
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;
Ancak, yenileme bayrağının senkronize olarak güncellendiğinden emin değilim (yani, yenilemenin gerçekten tamamlanmasını bekler)
Bu yaklaşım mantıklı mı yoksa burada bir şey mi kaçırıyorum?