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的实现存在问题,不过对于用户而言,当然是限制越少越好。

返回栏目页:http://www.bianceng.cnhttp://www.bianceng.cn/database/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

作者:51cto博客 Oracle小混子

时间: 2024-08-01 12:38:25

Oracle中串行隔离对延迟段和INTERVAL分区的支持的相关文章

PostgreSQL 10.0 preview 功能增强 - 串行隔离级别 预加锁阈值可控

标签 PostgreSQL , 10.0 , 串行隔离级别 , max_pred_locks_per_relation , 预加锁 背景 PostgreSQL 串行隔离级别中一个重要的概念是预加锁,在事务结束时,检测预加锁是否冲突. 10.0增加了三个控制参数,可以控制预加锁的上限.避免内存过度使用. 1. 控制每个事务的对象预加锁数量. max_pred_locks_per_transaction (integer) The shared predicate lock table tracks

PHP中串行化用法示例_php技巧

本文实例讲述了PHP中串行化用法.分享给大家供大家参考,具体如下: 功能:串行化用于对对象的存储或者传输,通过反串行化得到这个对象. 1. Person.class.php: <?php /* 作者 : shyhero */ class Person{ //声明一个Person类 public $age; private $name; protected $sex; public function __construct($age="",$name="",$s

在JAVA端使Oracle存储过程串行地执行

我们知道给资源上锁可以使我们串行化地访问资源,oracle为plsql开发人员提供了DBMS_SQL包用来管理USERL LOCK锁资源.这种锁可以使得多个session串行的执行某个存储过程,还可以用来排他的访问某个外部设备或服务,甚至可以检测事务的提交或回滚(提交或回滚时锁的释放). 有人说我在java端调用db的存储过程,可以使用synchronized lock来串行的调用存储过程.那就不需要db lock呢?因为当java端应用服务器down的时候,存储过程已经在执行了,但是可能ora

oracle中row-chains行链接的办法

-------行链接 /***重建跨多个数据块的数据行 生产环境中,数据变更后 会导致很多数据行会存储在多个数据块中.从而导致IO使用频率增高并进一步导致并查询速 度变慢. 平时维护中需要DBA重建跨多个数据块的数据行使其每一行数据都尽可能位 于一个数据块中. ***/ ------------------------- --1.验证是否有行链接 方法 ------------------------- create tablespace test datafile 'F:\APP\ADMINI

C#中串行通讯控件mscomm.ocx遇到的很奇怪的问题!?

问题描述 我在用c#开发一个收发短信的程序,需要与串口短信猫通信,于是我就采用了mscomm32.ocx控件,注册引用一切正常,代码可以通过编译,生成的程序运行也很正常,没有任何错误提示,但是运行时却总是没有结果,我设置断点调试了一下,结果发现出现了一个很奇怪的问题,实在无法理解,各位谁有这方面的经验,帮助一下啊,在线等ing--下面是出现问题的代码:部分代码:----stringBuffer="";stringbufy="AT+CSCA?r";inti=0;whi

mysql中不同事务隔离级别下数据的显示效果

  事务是一组原子性的SQL查询语句,也可以被看做一个工作单元.如果数据库引擎能够成功地对数据库应用所有的查询语句,它就会执行所有查询,如果任何一条查询语句因为崩溃或其他原因而无法执行,那么所有的语句就都不会执行.也就是说,事务内的语句要么全部执行,要么一句也不执行. 事务的特性:acid,也称为事务的四个测试(原子性,一致性,隔离性,持久性) automicity:原子性,事务所引起的数据库操作,要么都完成,要么都不执行 consisitency:一致性,事务执行前的总和和事务执行后的总和是不

Oracle中的并行

Oracle中的并行 一Oracle中的并行 首先Oracle会创建一个进程用于协调并行服务进程之间的信息传递这个协调进程将需要操作的数据集例如表的数据块分割成很多部分称为并行处理单元然后并行协调进程给每个并行进程分配一个数据单元.例如有四个并行服务进程它们就会同时处理各自分配的单元当一个并行服务进程处理完毕后协调进程就会给它们分配另外的单元如此反复直到表上的数据都处理完毕最后协调进程负责将每个小的集合合并为一个大集合作为最终的执行结果返回给用户.并行处理的机制实际上就是把一个要扫描的数据集分成

请问多线程的同步和串行有什么区别

问题描述 请问多线程的同步和串行有什么区别 如果一段代码被锁住执行完再去执行另一段代码,这和顺序执行有什么区别呢,求各位大神解答啊 解决方案 没错,同步的代码,从本质上说,相当于串行(非并发)执行. 解决方案二: 多线程只有同步和异步之分,没有同步和串行. 串行一般只代码一行行有序执行.至于同步异步实际不关心. 解决方案三: 我的意思是如果同步了,不就跟顺序执行一个意思了么,执行完一个块再执行另一个块,那这样的话多线程的同步实际上没有实现并发啊,这个时候的多线程是为了什么呢 解决方案四: 其实多

Oracle中SYS用户对象不支持延迟段

在11.2环境中尝试建立一个延迟段属性的表碰到了ORA-14223错误: 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.