您的位置:首页 > 数据库 > Oracle

Oracle技术之串行隔离对延迟段和INTERVAL分区的支持

2013-07-09 10:09 477 查看
前两天看文档,提到了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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息