您在这里:首页 > 学员专区 > 技术文章
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-88589926(88587026)
CUUG热门培训课程
Oracle DBA就业培训
CUUG名师
网络课程
技术沙龙
最新动态

总机:(010)-88589926,88589826,88587026 QQ讨论群:243729577 182441349 邮箱:cuug_bj@cuug.com
通信地址:北京市海淀区紫竹院路98号北京化工大学科技园609室(CUUG)邮政编码:100089 
中国UNIX用户协会 Copyright 2010  ALL Rights Reserved 北京神脑资讯技术有限公司
京ICP备11008061号  京公网安备110108006275号