Oracle技术之串行隔离对延迟段和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



oracle视频教程请关注:http://u.youku.com/user_video/id_UMzAzMjkxMjE2.html

你可能感兴趣的:(oracle,延迟段,串行隔离,INTERVAL分区)