DBMS_MVIEW.REFRESH在执行时阻止MV处使用的表的INSERTS和UPDATES吗?

时间:2014-05-03 02:18:19

标签: transactions oracle10g database materialized-views

我觉得这个问题很清楚,但仍然是一个例子:

假设我有一个名为“MY_MATERIALIZED_VIEW”的MV,使用

创建
CREATE MATERIALIZED VIEW MY_MATERIALIZED_VIEW PARALLEL PARTITION BY RANGE (some_date)
    (
      PARTITION RESULT_MATRIX_V_2012 VALUES LESS THAN (TO_DATE('01/01/2013','dd/MM/yyyy')),
      PARTITION RESULT_MATRIX_V_2013 VALUES LESS THAN (TO_DATE('01/01/2014','dd/MM/yyyy')),
      PARTITION RESULT_MATRIX_V_2017 VALUES LESS THAN (MAXVALUE)
    )
    NOCOMPRESS
    LOGGING
    BUILD DEFERRED
    USING INDEX TABLESPACE XXISLT_INDEX
    REFRESH FAST ON COMMIT
    USING DEFAULT LOCAL ROLLBACK SEGMENT
    DISABLE QUERY REWRITE AS
 SELECT c1,c2
 FROM SOME_TABLE;

然后我执行

EXEC DBMS_MVIEW.REFRESH('MY_MATERIALIZED_VIEW','C');

现在让我们说最后一条指令需要大约4个小时才能完成,在此之前我会尝试这样做

update SOME_TABLE SET c1 = 4 where c2 = 6;

会发生什么? SOME_TABLE被阻止了吗? 我怀疑是因为我没有找到任何明确的文件,

问候,

1 个答案:

答案 0 :(得分:0)

更新会成功。

物化视图刷新就像任何其他阅读器进程一样。从表中读取的进程不会阻止任何其他会话读取该表中的数据。就像任何其他阅读器一样,物化视图将看到插入操作开始时存在的数据。换句话说,物化视图将反映更新之前的数据。

当然,如果您实际创建了所描述的物化视图,则不需要调用dbms_mview.refresh,因为它已设置为刷新时提交。由于您可以进行增量刷新,因此在这样的物化视图上进行完全刷新通常没有多大意义。如果您能够创建物化视图,则意味着您在some_table上有物化视图日志,在这种情况下,刷新过程通常会使用物化视图日志中的数据而不是表中的数据