oracle INTERVAL分区表锁分区操作概述

在文档中,对INTERVAL分区执行一些操作之前都会先执行分区的锁定操作。

和其他类型的分区表不同,INTERVAL分区表的分区并不一定是已经存在的,分区是否存在与用户插入的数据的范围有关。

可以看到,文档在对INTERVAL分区执行SPLIT等分区操作之前都会执行一个锁分区的操作,事实上这个锁操作并非是避免用户DML对DDL操作的影响,而是为了确保要操作的分区存在:

SQL> CREATE TABLE T_PART_INTER

2  (ID NUMBER,

3  NAME VARCHAR2(30),

4  CREATE_DATE DATE)

5  PARTITION BY RANGE (ID)

6  INTERVAL (100)

7  (PARTITION P1 VALUES LESS THAN (100),

8  PARTITION P2 VALUES LESS THAN (200));

表已创建。

SQL> SELECT TABLE_NAME, PARTITION_NAME, HIGH_VALUE

2  FROM USER_TAB_PARTITIONS

3  WHERE TABLE_NAME = 'T_PART_INTER';

TABLE_NAME      PARTITION_NAME  HIGH_VALUE

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

T_PART_INTER    P1              100

T_PART_INTER    P2              200

SQL> ALTER TABLE T_PART_INTER

2  MOVE PARTITION FOR(250);

ALTER TABLE T_PART_INTER

  *

第1行出现错误:

ORA-02149:指定的分区不存在

SQL> LOCK TABLE T_PART_INTER

2  PARTITION FOR(250)

3  IN SHARE MODE;

表已锁定。

SQL> ALTER TABLE T_PART_INTER

2  MOVE PARTITION FOR(250);

表已更改。

SQL> SELECT TABLE_NAME, PARTITION_NAME, HIGH_VALUE

2  FROM USER_TAB_PARTITIONS

3  WHERE TABLE_NAME = 'T_PART_INTER';

TABLE_NAME      PARTITION_NAME  HIGH_VALUE

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

T_PART_INTER    P1              100

T_PART_INTER    P2              200

T_PART_INTER    SYS_P102        300

可以看到,LOCK TABLE使得Oracle新增了INTERVAL分区。

从这个现象推测,新增数据会导致INTERVAL新增分区,LOCK PARTITION也会导致新增分区,而新增数据会导致LOCK PARTITION,那么Oracle很可能是在监测到锁分区的操作之后对INTERVAL分区进行了新增操作。

查看本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/database/Oracle/

SQL> LOCK TABLE T_PART_INTER

2  PARTITION FOR (320)

3  IN ROW SHARE MODE;

表已锁定。

SQL> LOCK TABLE T_PART_INTER

2  PARTITION FOR (430)

3  IN ROW EXCLUSIVE MODE;

表已锁定。

SQL> LOCK TABLE T_PART_INTER

2  PARTITION FOR (560)

3  IN SHARE ROW EXCLUSIVE MODE;

表已锁定。

SQL> LOCK TABLE T_PART_INTER

2  PARTITION FOR (670)

3  IN EXCLUSIVE MODE;

表已锁定。

SQL> LOCK TABLE T_PART_INTER

2  PARTITION FOR (780)

3  IN SHARE UPDATE MODE;

表已锁定。

SQL> SELECT TABLE_NAME, PARTITION_NAME, HIGH_VALUE

2  FROM USER_TAB_PARTITIONS

3  WHERE TABLE_NAME = 'T_PART_INTER';

TABLE_NAME      PARTITION_NAME  HIGH_VALUE

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

时间: 2024-08-03 04:24:41

oracle INTERVAL分区表锁分区操作概述的相关文章

oracle范围分区表和INTERVAL分区表对于SPLIT分区的区别

范围分区表和INTERVAL分区表是可以相互转化的,不过二者还是有所区别的.比如在SPLIT分区的时候,范围分区表没有限制,而INTERVAL分区表则可能报错. 首先看范围分区的例子: SQL> CREATE TABLE T_PART_RANGE 2  (ID NUMBER, 3  NAME VARCHAR2(30), 4  CREATE_DATE DATE) 5  PARTITION BY RANGE (CREATE_DATE) 6  (PARTITION P1 VALUES LESS THA

oracle范围分区表和INTERVAL分区表的相互转化

INTERVAL分区其实是一种比较特殊的范围分区,因此可以很方便的将RANGE分区表转化为INTERVAL分区表,同样可以将INTERVAL分区表转化为RANGE分区表. 对于一个普通的范围分区表: SQL> CREATE TABLE T_PART 2  (ID NUMBER, 3  NAME VARCHAR2(30), 4  CREATE_DATE DATE) 5  PARTITION BY RANGE (ID) 6  (PARTITION P1 VALUES LESS THAN (100),

SQL Server和Oracle中的锁和死锁

1.锁的作用 ORACLE : 锁是一种机制,当某个数据库对象正被其他进程或用户修改时,这种机制可以保护它不被修改. 为了防止对象被两个不同的用户同时修改,数据库系统创建了锁这种复杂的数据结构,来实现锁定机制,这种机制使用在oracle中称为排队的队列结构,以串行的方式执行锁. 锁的作用如下: 1) 他们坚持一致性和完整性,在事务处理期间,数据和对象保证它们的一致性和完整性. 2) 但对象不是立即可用时,它们提供一种队列结构,这种结构允许所有会话都加入到等候对象的队列中, 3) 自动处理锁机制

(ORACLE)查看分区表的相关信息

ORACLE数据库如何查看分区表的相关信息呢?不知道你有没有总结过这方面的知识.下面我们先创建两个表TEST. GPRS_CELLTOPVOL_WK来做实验,脚本如下: CREATE TABLE GPRS_CELLTOPVOL_WK ( DATE_CD NUMBER ( 8 ) NOT NULL , WK_CD NUMBER ( 2 ) NOT NULL , CITY_ID NUMBER ( 10 ) , CELL_EN_NAM VARCHAR2 ( 64 ) NOT NULL , CELL_C

boost锁的概述

●     boost锁的概述 boost库中提供了mutex类与lock类,通过组合可以轻易的构建读写锁与互斥锁.   ▲     mutex对象类 mutex类主要有两种:boost::mutex,boost::shared_mutex,其中mutex有lock和unlock方法,shared_mutex除了提供lock和unlock方法外,还有shared_lock和shared_unlock方法.因此,boost::mutex为独占互斥类,boost::shared_mutex为共享互斥

c#+oracle数据库行锁写法问题

问题描述 c#+oracle数据库行锁写法问题 请教各位高手: 我在c#+oracle,里面,想如此操作.当修改某一数据的前,先执行select行锁定,待修改完毕后再解锁.请问在不用存储过程的情况下,程序该如何写呢? 解决方案 最简单的是使用事务.http://www.cnblogs.com/yanghucheng/archive/2013/01/25/2876492.htmlhttp://happypigs.iteye.com/blog/1576282 解决方案二: 谢谢,能举个实际例子吗 解

Oracle行级锁的特殊用法简析_oracle

Oracle有许多的锁,各种锁的效用是不一样的.下面重点介绍Oracle行级锁,Oracle行级锁只对用户正在访问的行进行锁定.可以更好的保证数据的安全性. 如果该用户正在修改某行,那么其他用户就可以更新同一表中该行之外的数据. Oracle行级锁是一种排他锁,防止其他事务修改此行,但是不会阻止读取此行的操作. 在使用INSERT.UPDATE.DELETE 和SELECT-FOR UPDATE 等 语句时,Oracle会自动应用Oracle行级锁行级锁锁定.SELECT...FOR UPDAT

ORACLE 查询被锁住的对象,并结束其会话的方法_oracle

使用Oracle时,发现有表被锁,又不知道是谁(或者哪个程序)锁的,怎么办 ? 两步走: 1.查找出被锁对象的会话ID和序列号 执行如下SQL: -- 查询出被锁对象,并提供 kill 脚本 SELECT S.SID, S.MACHINE, O.OBJECT_NAME, L.ORACLE_USERNAME, L.LOCKED_MODE, S.OSUSESR, 'ALTER SYSTEM KILL SESSION '''|| S.SID || ', '|| S.SERIAL#||''';' AS

快速查出Oracle数据库中锁等待的方法_oracle

通常在大型数据库系统中,为了保证数据的一致性,在对数据库中的数据进行操作时,系统会进行对数据相应的锁定. 这些锁定中有"只读锁"."排它锁","共享排它锁"等多种类型,而且每种类型又有"行级锁"(一次锁住一条记录),"页级锁"(一次锁住一页,即数据库中存储记录的最小可分配单元),"表级锁"(锁住整个表).若为"行级排它锁",则除被锁住的该行外,该表中其它行均可被其它的