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;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章