1. 行级锁只对用户正在访问的行进行锁定
授权用户:
connect yyaccp/acccp;
create user user2 identified by chenmp;
grant create session to chenmp;
grant select ,insert,update,delete on order testlock to chenmp;
以下代码演示锁定表中的记录:
connect chenmp/chenmp ;
update yyaccp.testlock set name='wrong' where id=8;
重新打开 SQL/PLUS
connect yyaccp/yyaccp ;
update testlock set set name=’jeff wrong’ where id =8
Wait 子句使用方法
Connect chenmp/chenmp;
select * from yyaccp.testlock where id=8 for update;
重新打开SQL/PLUS
Connect yyaccp/accp;
select * from testlock where id=8 for update wait 5;
*** 注意 wait 只能用在 select 语句上
FOR UPDATE NOWAIT 使用
select * from testlock where id=8 for update nowait;
2.表级锁
以下代码演示了锁定 testlock 表 :
Connect chenmp/chenmp;
lock table yyaccp.testlock in share mode;
重新打开SQL/PLUS
Connect yyaccp/accp;
delete from testlock;
SQL/PLUS 停止响应(在第一个 SQL/PLUS 中 commit;)
如果多个用户锁定一个表那么所有的用户都不能在此表上进行更新操作,只有当所有用户执行 commit命令或者 rollback 命令结束事务时,锁才会被释放。
例如: connect yyaccp/accp;
Lock table testlock in share mode;
Connect chenmp/chenmp;
Lock table testlock in share mode;
Connect user1/user1;
Update testlock set name =’ping’ where id=8;
当user1 执行操作时,sql/plus 没有响应,必须要把 yyaccp 用户和 chenmp 用户解锁后才能进行操作 。
以下代码演示了以行共享的模式锁定 order_master 表
Connect chenmp/chenmp;
lock table yyaccp.testlock in row share mode;
输入以下命令更新 testlock 表
update yyaccp.testlock set name= 'ping' where id=8;
以上语句成功执行更新。
重新打开一个 sqlplus 窗口
Connect yyaccp/accp;
update yyaccp.testlock set name= 'ping' where id=8;
以上代码不能做更新操作.
update yyaccp.testlock set name= 'wrong' where id=7;
以上代码可以做更新操作
独占锁:
lock table yyaccp.testlock in exclusive mode nowait;
:范围分区根据表的某个列或一组列的值范围,决定将该数据存储在哪个分区上。可以根据序号分区,根据业务数据的产生日期分区等。
以下代码创建了sales表并且对数据进行了分区
drop table employeeinfo ;
Create table employeeinfo (
empid number(5),
empName varchar2(20) not null,
age number(10)
)
Partition by range (age)
(
Partition p1 values less than (20),
Partition p2 values less than (30),
Partition p3 values less than (40),
);
以下代码演示了根据年份进行分区
drop table personinfo cascade;
Create table personinfo (
personid number(5),
personName varchar2(20),
Birthday date not null
)
partition by rang(Birthday )
(
Partition p1 values less than(to_date(‘1978-10-10’,’yyyy-mm-dd’)),
Partition p2 values less than(to_date(‘1980-5-1’,’yyyy-mm-dd’)),
Partition p3 values less than(MAXVALUE)
);
散列分区通过在分区键值上执行一个散列函数来决定数据的物理位置。连续的分区键不必存储在相同的分区中。散列分区把记录平均地分布到不同地分区,减少了磁盘I/O争用地可能性。
以下代码创建了名为MY_EMP表,并分为2个散列分区。
drop table my_emp cascade;
create table my_emp(
Empno number(4),
Ename varchar2(15)
)
Partition by hash(empno)
(
Partition part_1,
Partition part_2
);
复合分区是散列分区和范围分区地结合,在创建复合分区时,先根据范围对数据进行分区,然后在这些分区内创建散列子分区。复合分区既具备范围分区便于管理地优点,又具备散列分区在数据放置和并行操作方面地优点。
drop table employees cascade;
create table employees(
emp_id varchar2(5),
work_date date not null,
salary number(10)
)
Partition by range (salary)
Subpartition by hash (emp_id)
Subpartitions 5
(
Partition p1 values less than (1500),
Partition p2 values less than (2000),
Partition p3 values less than (maxvalue)
);
列表分区允许用户明确地控制行到分区地映射,列表分区允许按自然方式对无序和不相关的数据集进行分组和组织。
drop table product cascade;
Create table product
(
product_id number (4) ,
product_type varchar2 (20) ,
product_name varchar2 (50)
)
Partition by list (product_type)
(
Partition p1 values('book'),
Partition p2 values('cd','dvd')
)
分区维护操作包括:添加分区,删除分区,截断分区,合并分区,拆分分区。
添加分区:
以下代码演示了向sales 表添加一个分区。
Alter table my_emp add partition part_3 ;
以下代码演示了删除 sales 表中的p4 分区
Alter table sales drop partition p4;
*** 注意:分区删除后数据库表中对应的数据也删除了。
截断分区将删除表分区中的所有记录,以下代码演示了如何删除sales 表中p3分区的记录
Alter table sales truncate partition p3;
合并分区可以将范围分区表或复合分区表的两个相邻分区连接起来,结果分区将继承被合并的两个分区的较高上界。下列代码演示了将sales 表中的P1和P2两个分区合并成一个P2 分区。
alter table employeeinfo merge partitions p1,p2 into partition p2;
拆分分区允许用户将一个分区拆分为两个。当分区过大,可以对分区进行拆分。以下代码演示了将 sales 表中的 P2 分区拆分为 P1和P2两个分区。
alter table employeeinfo split partition p2 at(20) into (partition p1,partition p2);
重命名分区:以下代码演示了将sales 表中的 p1 分区重命名为:p5
Alter table salse rename partition p1 to p5;
表分区数据字典:
User_tab_partitions;
User_ind_partitions;