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會通過結束其中一個事物來解除死鎖。

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