锁与分区

1 琐的概念
锁是数据库用来控制共享资源并访问的机制
锁用于保护正在被修改的数据
直到提交或回滚了事物之后,其他用户才可以更新数据

2 锁的优点
一致性
完整性
并发性

3 锁的分类
行级锁:对正在被修改的行进行锁定。其他用户可以访问除被锁定的行以外的行
oracle自动加上
insert
update
delete
select....from...for update [of colums][wait n][no wait];

表级锁
锁定整张表,限定其他用户对其操作
使用命令锁定表,应用表级锁的语法
lock table 表明 锁的类型名 mode;

表级锁的分类
行共享(row shared 简称rs锁); 允许用户进行任何操作,禁止排他锁定
Example: lock table emp in row shared mode;

行排他(row Exclusive 简称rx锁):允许用户进行任何操作,禁止共享锁
Exampel: lock table emp in row exclusive mode;

共享锁(share 简称s锁) : 其他用户只能查看,不能修改。
锁定表,仅允许用户查看表中行
禁止其他用户插入,修改和删除行
多个用户可以同时在同一张表中应用此锁
Example: lock table emp in share mode;

共享行排他:比共享锁有更多的限制,禁止使用共享锁及更高级的锁
排他锁(Exclusive 简称xs锁):其他用户只能查看,不能修改,不能加其他锁(此等级高于共享锁)
Example: lock table emp in exclusive mode;

--使用rollback释放锁

死锁:
当两个事物相互等待对方释放资源时,就会形成死锁
Oracle会自动检测死锁,并通过结束其中的一个事物来解决死锁

------------------------------------------------------------------------------------------------------------------------------------
--表分区:
分区方法:
范围分区:以表中的一个列或一组列的值的范围进行分区
--语法:
partition by range(column_name){
partition part1 values less than (range),
partition part1 values less than (range),
......
partition partN values less than (Maxvalue)
}
--案列
create table sales(
product_id int,
sale_cost number
)
partition by range(sale_cost)(
partition p1 values less than(1000),--包含销售额低于10000的所有产品记录
partition p2 values less than(2000),
partition p3 values less than(Maxvalue) --这里的Maxvalue大于前面的
);

insert into sales values(1001,900);
insert into sales values(1002,1900);
insert into sales values(1003,200);
insert into sales values(1004,30000);
insert into sales values(1005,50000);

--分区查询
select * from sales partition(p1);
select * from sales partition(p2);
select * from sales partition(p3);

拓展:
查看当前用户所拥有的分区
select * from user_tab_partitions;

散列分区: hash() --dump()
oracle使用一个散列函数,确定数据应当放在N个分区的哪一个分区。Oracle建议N是2的一个幂
将数据平均分布到不同的分区

--语法
partition by hash(column_name)
(
partition part1[tablespace tbs1],
partition part2[tablespace tbs2],
...............
partition partN[tablespace tbsN]
);

--案例
create table employee(
emp_id varchar2(20),
emp_name varchar2(20),
dept_name varchar2()
)
partition by hash(dept_name)
(
partition d1,
partition d2,
partition d3
)

列表分区
定制分区机制
允许将不想管的数据组织一起

--语法
partition by list(column_name)
(
partition part1 values (values_list1);
partition part1 values (values_list2);
。。。。。。。。。。。。。。。。。。。。。
partition part1 values (default)
);
--注意:如果定义了default分区,需要增加分区,则要先删除default分区
--案例
create table person(
per_id number,
per_name varchar2(20),
per_prov varchar2(20)
)
partition by list(per_prov)(
partition north values('吉林','黑龙江','辽宁'),
partition west values('甘肃','陕西'),
partition east values('上海','浙江'),
partition south values('广东','广西'),
partition p1 values(default)
);

--插入数据
insert into person values(1001,'yaobol','吉林');
insert into person values(1002,'yaobo2','黑龙江');
insert into person values(1003,'yaobo3','广西');
insert into person values(1004,'yaobo4','广东');
insert into person values(1005,'yaobo5','吉林');
insert into person values(1006,'yaobo6','浙江');
insert into person values(1007,'yaobo7','吉林');
insert into person values(1008,'yaobo8','上海');
insert into person values(1009,'yaobo9','吉林');
insert into person values(10010,'yaobol0','甘肃');
insert into person values(10011,'yaobol1','陕西');


复合分区:
范围分区:
范围分区与散列分区或列表分区的组合
--语法
partition by range(column_name) --创建范围分区
subpartition by hash(colum_name2)--创建散列子分区
subpartitions number_of_partitions
(
partition part1 values less than(range1),
partition part2 values less than(range2),
................
partition partN values less than (Maxvalue)

)

--案例
create table emp_sales(
pro_id varchar2(20),
sale_date date,
sale_cost number(10)
)
partition by range(sale_cast)
subpartition by hash(pro_id)
subpartitions 4
(
partition e1 values less than (to_date('2010-10-10','yyyy-MM-dd')),
partition e2 values less than (to_date('2012-10-10','yyyy-MM-dd')),
partition e3 values less than (maxvalue)
);

--查看当用户的子分区
select * from user_tab_subpartitions;


--分区维护操作;
分区维护操作是修改已分区表的分区
--分区维护的类型
计划事件--定期删除最旧的分区
非计划事件--解决应用程序或系统问题
--分区维护的操作
添加分区 --在最后一个分区的后面添加新的分区
alert table sales add partition p4 values less than(40000);

删除分区 --删除指定的分区,分区的数据也随之删除
alert table sales drop partition p3;

截断分区--删除指定分区中的所有记录
alert table sales truncate partition p2;

合并分区 --将范围分区或复合分区的两个相邻的分区合并
alert table sales merge partition p1,p2 into partition p6

拆分分区 --将一个大的分区记录拆分到两个分区中
alert table sales split partition p6 at(1000) into (partition p61,partition p62);

原文地址:https://www.cnblogs.com/yaobolove/p/4732480.html