Oracle锁及表分区

一.锁的概念

1.锁是数据库用来控制共享资源的机制

2.锁用来保护正在被修改的数据

3.只有用户rollback或者commit后才能进行,其它用户才能进行操作

二.锁的分类

1.行级锁

当使用insert 、 update  、delete  、select  for update会触发行级锁

select ...for update用法:允许用户一次锁定多条记录进行更新

2.表级锁

--表级锁

--LOCK TABLE table_name IN mode MODE;

注解:table_name指表的名字   mode指表级锁的类型

--1行共享 (ROW SHARE ) – 禁止排他锁定表

--2行排他(ROW EXCLUSIVE ) – 禁止使用排他锁和共享锁

--3共享锁(SHARE )

--3.1锁定表,仅允许其他用户查询表中的行

--3.2禁止其他用户插入、更新和删除行

--3.3多个用户可以同时在同一个表上应用此锁

--4共享行排他(SHARE ROW EXCLUSIVE) – 比共享锁更多的限制,禁止使用共享锁及更高的锁

--5排他(EXCLUSIVE ) – 限制最强的表锁,仅允许其他用户查询该表的行。禁止修改和锁定表

 

3.死锁

当两个事务相互等待对方释放资源时,就会形成死锁

Oracle会自动检测死锁,并通过结束其中的一个事务来解决死锁

二.表分区

--范围分区

create table customer(

 cust_id number primary key,

 cust_name varchar2(20),

 cust_statius char(2)

)

partition by range(cust_id)(

partition cust_partl values less than(200),--cust_part1分区名字

partition cust_part2 values less than(400),

partition cust_part3 values less than(maxvalue)

);

 

insert into customer values(1,'a','12');

insert into customer values(240,'a','12');

insert into customer values(700,'a','12');

insert into customer values(210,'a','12');

commit;

 

select*from customer partition(cust_partl);

 

--列表分区partition by list

create table stu(

s_id number(20)primary key,

s_name varchar2(20)not null,

s_address varchar2(50)

)

 

partition by list(s_address)(

partition s_part1 values('长沙'),

partition s_part2 values('株洲'),

partition s_part3 values('湘潭')

);

 

insert into stu values(1,'张三','长沙');

insert into stu values(2,'李四','株洲');

insert into stu values(3,'王五','湘潭');

insert into stu values(4,'马六','株洲');

insert into stu values(5,'哈七','长沙');

commit;

 

select*from stu;

select*from stu partition(s_part1)order by s_name;--按s_part1(长沙)分区进行查询,按名字进行排序

select*from stu partition(s_part2);--按s_part2(株洲)分区进行查询

select*from stu partition(s_part3);--按s_part3(湘潭)分区进行查询

 

--散列分区 partition by hash,不知道数据存在那个分区,由oracle底层根据hash值来进行分区

create table  info(

  id number(20)primary key,

  msg varchar2(20)

)

partition by hash(id)(

partition part1,

partition part2,

partition part3

);

insert into info values(1,'吃辣条');

insert into info values(2,'吃面包');

insert into info values(3,'吃米饭');

insert into info values(4,'吃辣椒');

commit;

select*from info;

select*from info partition (part1);

select*from info partition (part2);

select*from info partition (part3);

 

--复合分区

create table sales(

id number(20)primary key,

name varchar2(20),

s_date date,

status varchar2(20)

)

partition by range(id)subpartition by list(status)(

partition part1 values less than(100)(

subpartition part101 values ('已支付'),

subpartition part102 values('未支付')

),

partition part2 values less than(200)(

subpartition part201 values ('已支付'),

subpartition part202 values('未支付')

),

partition part3 values less than(maxvalue)(

subpartition part301 values ('已支付'),

subpartition part302 values('未支付')

)

);

 

insert into sales values(1,'安踏',sysdate,'未支付');

insert into sales values(201,'特步',sysdate,'未支付');

insert into sales values(305,'李宁',sysdate,'已支付');

insert into sales values(455,'耐克',sysdate,'已支付');

commit;

select*from sales;

 

select*from sales partition (part1);

select*from sales partition (part2);

select*from sales partition (part3);

 

select*from sales subpartition (part102);

select*from sales subpartition (part301);

select*from sales subpartition (part302);

四.表分区的操作

添加、删除、合并、截取

--添加一个stu的表

create table stu(

id number(20),

name varchar2(20)

)

partition by range(id)(

partition part1 values less than(20)

);

drop table stu;

insert into stu values(1,'小明');

commit;

insert into stu values(43,'小红');

commit;

select*from stu partition (part1);

select*from stu partition (part2);

 

--添加分区 add

alter table stu add partition part2 values less than(50);

--删除分区,数据也会删除 drop

--如果要删除子分区,可以使用 drop subpartition

alter table stu drop partition part2;

--截取分区 truncate,删除数据,不删除分区

alter table stu truncate partition part2;

--分区的合并 merge partition....into partition...

--如果想快速合并分区,可以不加 update indexes 参数,合并完索引后 alter index rebuild partition 重建索引;

alter table stu  merge partitions part1,part2 into partition part2;

--拆分分区(将part2分区进行拆分,part21(20-40),part2(40-50),且part2分区不存在)

--注意:如果是RANGE类型的,使用at,LIST类型的使用values。

alter table stu split partition part2 at (40)into (partition part21,partition part22)update indexes;

--重命名分区

 alter table stu rename partition part21 to part2a;

 alter table stu rename partition part22 to part2b;

你可能感兴趣的:(Oracle数据库,数据库,分区,锁,oracle)