关于 REFRESH MATERIALIZED VIEW
的官方 PostgreSQL 9.3 文档尚未详细描述。
引自此blog :
materialized views in Postgres 9.3 have a severe limitation consisting in using an exclusive lock when refreshing it. This basically blocks any attempts to read a materialized view while it is being refreshed with new data from its parent relations
引用自 mailing list 中的一个帖子:
if I understand things correctly REFRESH MATERIALIZED VIEW locks the materialized view with an AccessExclusiveLock even if the view already contains data.
我的问题:以下顺序是否正确:
- 查询正在访问物化 View
- 作业执行
REFRESH MATERIALIZED VIEW
。它锁定 View ,并等待所有使用 matview 的运行查询完成 - matview 正在开始刷新;如果 matview 上有一个索引,它会同时更新(所以完整的刷新发生在一个事务中)
- 使用 matview 的查询正在等待刷新完成。如果这花费的时间太长,则会出现类似“等待锁定超时错误”的错误。
- 刷新完成,解除锁定
- 一直在等待 matview 的查询继续
最佳答案
随着 Postgres 9.4 的发布,情况并非完全如此。您现在可以使用 REFRESH MATERIALIZED VIEW CONCURRENTLY
命令并发刷新实例化 View 。从功能上讲,这会刷新 View ,但没有读锁。就计算而言,这是一个更昂贵的操作,但如果锁定对您来说是个问题(就像对我来说,这导致我走这条路),那么这不是一个坏方法。
以下是发行说明中的更多信息:https://wiki.postgresql.org/wiki/What%27s_new_in_PostgreSQL_9.4#REFRESH_MATERIALIZED_VIEW_CONCURRENTLY
关于postgresql - 刷新物化 View : Concurrency, 事务行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18811482/