行級鎖就是施放在行上的排他鎖,表級鎖就是會施放在表上的排他鎖。鎖分爲兩大類:共享鎖和排它鎖。共享鎖的意思就是可以其他用戶來鎖定表,而排它鎖不準其他用戶來鎖定表。
鎖具有:一致性(只允許一個用戶修改數據)、完整性(爲所有用戶提供完整的數據,即要麼取的都是修改前的數據,要麼都是修改後的數據),並行性(允許多個用戶訪問同一數據)
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會通過結束其中一個事物來解除死鎖。