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; beginfor i in 1..100loopinsert 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會通過結束其中一個事物來解除死鎖。
總結
以上是生活随笔為你收集整理的Oracle原理: 行级锁和表级锁的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Oracle原理:11g中的网络配置
- 下一篇: Oracle原理:11g的体系结构