授權用戶:
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;
以下代碼演示了以行共享的模式鎖定 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 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;