Oracle原理: 行级锁和表级锁

行级锁就是施放在行上的排他锁,表级锁就是会施放在表上的排他锁。锁分为两大类:共享锁和排它锁。共享锁的意思就是可以其他用户来锁定表,而排它锁不准其他用户来锁定表。

锁具有:一致性(只允许一个用户修改数据)、完整性(为所有用户提供完整的数据,即要么取的都是修改前的数据,要么都是修改后的数据),并行性(允许多个用户访问同一数据)

1.行级锁

在使用insert,update,delete,select...for update 这4种语法时,Oracle会自动的应用行级锁,直到用户commit;或者Rollback才会施放锁。为了保证一致性,在增删改操作时自然要先锁定要修改的数据,不让其他用户再操作,直到施放锁。在commit之前用户查询到的数据都是还没修改的,commit以后查询出来的数据才是修改后的。

drop table salary_tbl;
create  table salary_tbl(
   employer_nm varchar(20),
   department varchar(20) not null,
   salary number not null,
   leader_nm varchar(20)
);
truncate table salary_tbl;
begin
 for i in  1..100
     loop
     insert into salary_tbl values('雇佣者'||i,'部门'||Mod(i,6),100*POWER(10000,i*0.01),'雇佣者'||Mod(i,6)); 
   end loop;
end; 
/
commit;

用上述语法在普通用户voapd上创建薪资表和添加数据,用两个sqlplus窗口进行测试:

可以发现右边的命令窗口在正在等待,因为左边窗口的select...for update 把数据行给锁上了。此时可以用sql查询锁的信息:select * from v$lock where TYPE in('TM','TX')

其中 TM 指的是表级锁,TX指的是行级锁,查询结果如下图(SID指用户ID)。

此时左边的命令窗commit,或者rollback 施放了锁之后,右边的才能够执行update语句,此时才轮到右边的给行数据加锁.。此时的锁是行级锁。其他用户可以对表的其他数据进行增删改操作。

 

2,表级锁

  LOCK TABLE [tablename] IN [row share/SHARE/EXCLUSIVE...] MODE;

(1)行共享 (ROW SHARE) – 禁止排他锁定表。禁止EXCLUSIVE再锁上同一张表,不禁止用户增删改表记录

(2)行排他(ROW EXCLUSIVE) – 禁止使用排他锁和共享锁,禁止同时使用EXCLUSIVE,SHARE ROW EXCLUSIVE锁。不禁止用户增删改表记录

(3)共享锁(SHARE) 

        锁定表,仅允许其他用户查询表中的行

        禁止其他用户插入、更新和删除行

        多个用户可以同时在同一个表上应用此锁

(4)共享行排他(SHARE ROW EXCLUSIVE) – 比共享锁更多的限制,禁止使用共享锁及更高的锁

(5)排他(EXCLUSIVE) – 限制最强的表锁,仅允许其他用户查询该表的行。禁止修改和锁定表

解锁表:用如下sql查询出sid,serial


select b.owner,b.object_name,a.session_id,a.locked_mode,c.serial#,c.sid||','||c.serial#
from v$locked_object a,dba_objects b ,v$session c
where b.object_id = a.object_id
And a.session_id = c.sid

然后 ALTER SYSTEM KILL SESSION '69,32' IMMEDIATE; 解除表锁定。

 

当出现死锁时,Oracle会通过结束其中一个事物来解除死锁。

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