您在这里:首页 > 学员专区 > 技术文章
  • oracle全球副总裁Robert Green和亚太地区副总裁Damien Garey莅临CUUG参观视察工作!
  • Oracle视频
    Oracle
    CUUG课程

    串行隔离对延迟段和INTERVAL分区的支持

     


    前两天看文档,提到了SERIALIZABLE隔离不支持延迟段创建和INTERVAL分区的功能,个人认为是由于这两种方式都是在DML中递归产生DDL的操作,因此在串行隔离时可能会导致问题。不过验证这个观点的时候,竟然发现现象与文档描述不符。

     

     

    文档上的描述为:

    Serializable transactions do not work with deferred segment creation or interval partitioning. Trying to insert data into an empty table with no segment created, or into a partition of an interval partitioned table that does not yet have a segment, causes an error.

    而实际运行的结果:

    SQL> SELECT * FROM V$VERSION;

    BANNER

    --------------------------------------------------------------------------------

    Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production

    PL/SQL Release 11.2.0.1.0 - Production

    CORE 11.2.0.1.0 Production

    TNS for 32-bit Windows: Version 11.2.0.1.0 - Production

    NLSRTL Version 11.2.0.1.0 - Production

    SQL> CREATE TABLE T_DETER

    2 (ID NUMBER)

    3 SEGMENT CREATION DEFERRED;

    表已创建。

    SQL> CREATE TABLE T_INTERVAL

    2 (ID NUMBER)

    3 PARTITION BY RANGE (ID)

    4 INTERVAL (1)

    5 (PARTITION P1 VALUES LESS THAN (1));

    表已创建。

    SQL> SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

    事务处理集。

    SQL> INSERT INTO T_DETER VALUES (1);

    已创建1行。

    SQL> COMMIT;

    提交完成。

    SQL> SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

    事务处理集。

    SQL> INSERT INTO T_INTERVAL

    2 SELECT ROWNUM

    3 FROM TAB;

    已创建12行。

    SQL> COMMIT;

    提交完成。

    不知道这算是文档的描述有误,还是Oracle的实现存在问题,不过对于用户而言,当然是限制越少越好。

     

    导入论坛 引用链接 收藏 分享给好友 推荐到圈子 管理 举报

    TAG:

     

    引用 删除 yangtingkun   /   2011-06-08 08:45:21

    to redhouser:

    既是你说的可以解释延迟段创建,也解释不了INTERVAL分区。

    详细测试过程如下:

    SQL> SHOW USER

    USER 为 "TEST"

    SQL> SELECT DEFAULT_TABLESPACE FROM USER_USERS;

     

    DEFAULT_TABLESPACE

    ------------------------------

    USERS

     

    SQL> CREATE TABLE T_DEFER (ID NUMBER)

      2  SEGMENT CREATION DEFERRED;

     

    表已创建。

     

    SQL> SELECT SEGMENT_NAME

      2  FROM USER_SEGMENTS

      3  WHERE SEGMENT_NAME = 'T_DEFER';

     

    未选定行

     

    SQL> SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

     

    事务处理集。

     

    SQL> INSERT INTO T_DEFER

      2  SELECT ROWNUM

      3  FROM TAB;

     

    已创建7行。

     

    SQL> SELECT SEGMENT_NAME

      2  FROM USER_SEGMENTS

      3  WHERE SEGMENT_NAME = 'T_DEFER';

     

    未选定行

     

    SQL> SELECT * FROM T_DEFER;

     

            ID

    ----------

             1

             2

             3

             4

             5

             6

             7

     

    已选择7行。

     

    SQL> COMMIT;

     

    提交完成。

     

    SQL> SELECT SEGMENT_NAME

      2  FROM USER_SEGMENTS

      3  WHERE SEGMENT_NAME = 'T_DEFER';

     

    SEGMENT_NAME

    ----------------------------------------------------------------

    T_DEFER

     


    (以上内容摘于网络,如有侵权,请告之,将第一时间删除)

    相关文章 [上一篇] 利用DETERMINISTIC声明提高性能(二)
    010-56426307(59426319)
    CUUG热门培训课程
    Oracle DBA就业培训
    CUUG名师
    网络课程
    技术沙龙
    最新动态

    总机:(010)-56426307,59426319 QQ讨论群:243729577 182441349 邮箱:yuezt@cuug.com
    通信地址:北京市海淀区紫竹院路88号紫竹花园D座703(CUUG)邮政编码:100089 
    中国UNIX用户协会 Copyright 2010  ALL Rights Reserved 北京神脑资讯技术有限公司
    京ICP备11008061号