本篇內容主要講解“Oracle的鎖機制原理”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強。下面就讓小編來(lái)帶大家學(xué)習“Oracle的鎖機制原理”吧!
一.ORACLE中有關(guān)鎖的動(dòng)態(tài)性能視圖主要有:
V$LOCK
This view lists the locks currently held by the Oracle Database and outstanding requests for a lock or latch.
TM鎖的ID1字段表示對象的ID號,可以通過(guò)DBA_OBJECTS.OBJECT_ID來(lái)查到具體的對象。
TX鎖的ID1代表的是事務(wù)的回滾段回滾段號、事務(wù)槽號,ID2代表的是順序號。(V$TRANSACTION.XIDSQN表示事務(wù)槽號)
有關(guān)VLOCK.ID1和ID2的含義可參考文章:http://space.itpub.net/?uid-23135684-action-viewspace-itemid-715468
BLOCK字段如果等于1的話(huà),表示此鎖阻塞了其他DML語(yǔ)句的執行,正常應該為0。
BLOCK字段的含義:
0, 'Not Blocking', /* Not blocking any other processes */
1, 'Blocking', /* This lock blocks other processes */
2, 'Global', /* This lock is global, so we can't tell */
$ORACLE_HOME/rdbms/admin/catblock.sql
特別注意:0表示沒(méi)有阻塞,而不是表示沒(méi)有鎖。
如果要查詢(xún)是否有會(huì )話(huà)阻塞了其他會(huì )話(huà):
SELECT * FROM V$LOCK WHERE BLOCK=1;
通過(guò)查詢(xún)V$SESSION.BLOCKING_SESSION_STATUS,v$SESSION.BLOCKING_SESSION兩個(gè)字段也可以查看到阻塞其他的會(huì )話(huà)。
如果LMODE為0,REQUEST大于1,表示在獲取鎖的時(shí)候失敗,發(fā)生了相應鎖的阻塞。例如,在執行DML語(yǔ)句時(shí),如果TYPE=TM,LMODE=0,REQUEST=3,就表示此DML語(yǔ)句在獲取表的TM鎖的行排它鎖時(shí)被阻塞,處于等待狀態(tài)。
查找阻塞事務(wù)的事務(wù)會(huì )話(huà)信息:
select * from v$lock where (id1,id2)=(select id1,id2 from v$lock where sid= 被鎖的會(huì )話(huà)的SID)
V$LOCKED_OBJECT
This view lists all locks acquired by every transaction on the system.
V$LOCK_TYPE
二.其中我們主要查看的是:
LOCK TYPE(按對象劃分)
V$LOCK_TYPE保存了所有的LOCK TYPE的相關(guān)信息。
主要的有:
TM - DML enqueue
TX - Transaction enqueue
UL - User supplied
MR -Media Recovery
MR鎖用于保護數據文件,使得文件在數據庫打開(kāi)、表空間Online時(shí)不能執行恢復。當進(jìn)程對數據文件進(jìn)行恢復時(shí),需要排他的獲得MR鎖。當數據庫打開(kāi)時(shí),每個(gè)文件上都分配一個(gè)MR鎖。ID1代表文件號,也包含了201臨時(shí)文件。
從Oracle 11g開(kāi)始,每個(gè)登錄的會(huì )話(huà)都會(huì )有一個(gè)默認的AE鎖。
LOCK MODE(按類(lèi)型劃分)
0 - none
1 - null (NULL)
2 - row-S (SS) //行共享
3 - row-X (SX) //行排它
4 - share (S) //共享
5 - S/Row-X (SSX) //共享行排它
6 - exclusive (X) //排它
從以上LOCK MODE也能看出按類(lèi)型分鎖只有2種,共享(S),排它(X),把他們不同的組合就成了不同的LOCK MODE了。如果添加的是X鎖,那么其他任何鎖也不能再添加到此行或表上了。
TM就是DML鎖,是表級上的鎖。TX是事務(wù)鎖,是行級鎖。在執行DML操作時(shí),先對表加TM鎖,如果加鎖成功,然后再加TX鎖。一般情況下,一個(gè)會(huì )話(huà)中,只會(huì )出現一個(gè)TX鎖,可能有多個(gè)TM鎖,這些TM所共享一個(gè)TX鎖。不同的語(yǔ)句加TM鎖的類(lèi)型不同,類(lèi)型就是下面說(shuō)的LOCK MODE。在表級上加了TM鎖也是為了防止其他會(huì )話(huà)再在表上加上排它鎖(例如對表執行DDL語(yǔ)句)。一個(gè)表上可以加上多個(gè)TM鎖、TX鎖的。例如,A會(huì )話(huà)更新了TEST表上ID號為1的一條記錄,首先會(huì )先在這個(gè)表上加上一個(gè)TM鎖,加鎖成功,會(huì )在ID為1的行上加上一個(gè)TX鎖。如果有另外一個(gè)會(huì )話(huà)來(lái)同樣來(lái)更新ID為1的記錄就會(huì )發(fā)生阻塞,因為加TM鎖能成功,但是加TX鎖失敗。如果更新的記錄是ID=2那么就是成功的。這是表上就存在多個(gè)TM、TX鎖。如果在表上加上TM鎖成功,那么除了在V$LOCK會(huì )有相應的記錄外,V$LOCKED_OBJECT也有相應對象的記錄。
行級鎖只有排他鎖沒(méi)有共享鎖。
另外,select語(yǔ)句不會(huì )添加任何鎖,所以一般的TX,TM鎖都不會(huì )阻塞select語(yǔ)句的執行。唯一能阻塞select語(yǔ)句執行的是latch鎖,一旦發(fā)生latch鎖阻塞select語(yǔ)句的執行,對系統的正常運行非常的大,甚至會(huì )導致系統的崩潰。
三.示例
示例1:
SQL> update test set segment_name='test' where wner='SYS';
已更新4044行。
SQL> select sid,type,lmode from v$lock where sid=128;
SID TY LMODE
---------- -- ----------
128 TM 3
128 TX 6
SQL> select session_id,locked_mode from v$locked_object;
SESSION_ID LOCKED_MODE
---------- -----------
128 3
示例2:
SQL> select * from test for update;
SQL> select sid,type,lmode from v$lock where sid=36;
SID TY LMODE
---------- -- ----------
36 TM 3
36 TX 6
SQL> select session_id,locked_mode from v$locked_object;
SESSION_ID LOCKED_MODE
---------- -----------
36 3
有時(shí)候查詢(xún)v$LOCK會(huì )發(fā)現只有TM鎖,沒(méi)有TX鎖,那是因為在執行DML語(yǔ)句或select ...for update語(yǔ)句時(shí)操作的記錄是0條,所以只加上了TM鎖,沒(méi)有行需要加TX鎖。
四.手動(dòng)添加鎖:
級別從低到高,SS可以添加除了X其他的所有類(lèi)型的鎖。而X鎖不能添加其他任何的鎖。
創(chuàng )建索引時(shí)添加的是TM的S鎖,MODE值為4,這個(gè)時(shí)候是不允許執行任何的DML語(yǔ)句的,因為無(wú)法在表上添加任何其他排它類(lèi)型的TM鎖。當然我們在創(chuàng )建索引時(shí)可以指定ONLINE關(guān)鍵字,可以避免阻塞DML語(yǔ)句情況的出現。
//行共享 SS
LOCK TABLE TABLE_NAME IN ROW SHARE MODE;
//行排它 SX
LOCK TABLE TABLE_NAME IN ROW EXCLUSIVE MODE;
//共享鎖 S
LOCK TABLE TABLE_NAME IN SHARE MODE;
//共享行排它 SSX
LOCK TABLE TABLE_NAME IN SHARE ROW EXCLUSIVE MODE;
//排它鎖 X
LOCK TABLE TABLE_NAME IN EXCLUSIVE MODE;
通過(guò)ROLLBACK或COMMIT來(lái)釋放鎖。
五.相關(guān)參數:
dml_locks=0(dml_locks相關(guān)含義請看另一篇文章:http://space.itpub.net/23135684/viewspace-626728)
SQL> update test set segment_name='test' where wner='SYS';
已更新4044行。
SQL> select sid,type,lmode from v$lock where sid=128;
SID TYPE LMODE
---------- ---- ----------
128 TX 6
SQL> select session_id,locked_mode from v$locked_object;
未選定行
SQL> drop table test;
drop table test
*
第 1 行出現錯誤:
ORA-00062: 無(wú)法獲得 DML 全表鎖定; DML_LOCKS 為 0
由此證明:如果dml_locks=0,那么執行dml語(yǔ)句,表級的TM鎖已經(jīng)不存在了,但是行級別的TX事務(wù)鎖還是存在的。由于不能在表級上添加任何鎖,所以更無(wú)法執行DDL語(yǔ)句對表進(jìn)行操作。
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自本網(wǎng)站內容采集于網(wǎng)絡(luò )互聯(lián)網(wǎng)轉載等其它媒體和分享為主,內容觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如侵犯了原作者的版權,請告知一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容,聯(lián)系我們QQ:712375056,同時(shí)歡迎投稿傳遞力量。
Copyright ? 2009-2022 56dr.com. All Rights Reserved. 特網(wǎng)科技 特網(wǎng)云 版權所有 特網(wǎng)科技 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 百度云 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2
建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站