Jef*_*man 6 transaction materialized-view postgresql-9.4
PostgreSQL 9.4 支持REFRESH MATERIALIZED VIEW CONCURRENTLY
.
我不确定,但我认为 REFRESH 命令被 PostgreSQL 视为 DDL,并且 PostgreSQL 将所有 DDL 包装在事务中,以便并发事务无法看到其他并发事务发出的 DDL 命令的影响。
我通过打开两个事务,插入数据,然后刷新其中一个事务中的物化视图,然后查询两个事务中的物化视图来验证这一点。只有第一个事务看到更新的物化视图。
有一些边缘情况我很好奇——我尝试测试这些,但我的数据集太小,所以刷新完成得太快:
如果两个事务尝试并行刷新物化视图会发生什么?这是允许的还是会抛出错误?
如果允许,刷新是并行执行还是串行执行?他们会互相放慢速度吗?哪个结果最终会“获胜”?
假设我有一个有很多用户的应用程序。这会产生问题,应用程序为第一个用户打开一个事务,意识到物化视图缺少一个条目,因此它在返回数据之前刷新物化视图,然后另一个用户的事务在第一次刷新完成之前出现并执行相同的操作事物。无论它们是并行的还是串行的,似乎这可能会造成临时积压效应,在刷新命令的发出速度比处理速度更快的地方迅速堆积。一旦其中一个刷新完成第一个完成,任何新事务都不会尝试刷新它,但这仍可能需要很长时间。特别是如果并发刷新彼此减慢速度,这可能会很快变得痛苦。