PostgreSQL物化视图刷新与pg_dump能否并发执行?
REFRESH MATERIALIZED VIEW 与 pg_dump 的等待问题分析
核心原因:锁级别冲突
PostgreSQL中不同操作的锁级别兼容性,直接决定了REFRESH MATERIALIZED VIEW和pg_dump之间的等待关系,分两种刷新模式说明:
1. 全量刷新(REFRESH MATERIALIZED VIEW)
全量刷新会获取ACCESS EXCLUSIVE锁——这是PostgreSQL中最严格的锁类型,与所有其他针对该物化视图的操作锁(包括读锁)冲突。
- 若
pg_dump先启动:pg_dump读取物化视图时会持有ACCESS SHARE锁(普通读锁),此时全量刷新无法获取所需的ACCESS EXCLUSIVE锁,只能等待pg_dump读取完成释放锁后才能执行。 - 若全量刷新先启动:刷新操作先持有ACCESS EXCLUSIVE锁,pg_dump要读取物化视图必须获取ACCESS SHARE锁,而该锁与ACCESS EXCLUSIVE锁冲突,因此pg_dump会等待刷新完成。
2. 并发刷新(REFRESH MATERIALIZED VIEW CONCURRENTLY)
并发刷新会获取SHARE UPDATE EXCLUSIVE锁,这个锁仅与修改类操作(如其他刷新、DDL)冲突,与读操作的ACCESS SHARE锁兼容。
- 无论谁先启动,
pg_dump的读操作和并发刷新都可以同时进行,不会产生等待。
内容的提问来源于stack exchange,提问作者Christophe Leray
相关产品推荐
相关产品推荐

