Oracle锁及表分区

本文介绍了Oracle数据库的锁机制,包括行级锁和表级锁的类型及其作用,以及如何处理死锁。同时,详细讲解了表分区的四种方式:范围分区、列表分区、散列分区和复合分区,并展示了相关的创建、查询和操作示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.锁的概念

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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值