您好,登錄后才能下訂單哦!
本篇內容主要講解“Oracle的鎖機制原理”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Oracle的鎖機制原理”吧!
一.ORACLE中有關鎖的動態性能視圖主要有:
V$LOCK
This view lists the locks currently held by the Oracle Database and outstanding requests for a lock or latch.
TM鎖的ID1字段表示對象的ID號,可以通過DBA_OBJECTS.OBJECT_ID來查到具體的對象。
TX鎖的ID1代表的是事務的回滾段回滾段號、事務槽號,ID2代表的是順序號。(V$TRANSACTION.XIDSQN表示事務槽號)
有關VLOCK.ID1和ID2的含義可參考文章:http://space.itpub.net/?uid-23135684-action-viewspace-itemid-715468
BLOCK字段如果等于1的話,表示此鎖阻塞了其他DML語句的執行,正常應該為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表示沒有阻塞,而不是表示沒有鎖。
如果要查詢是否有會話阻塞了其他會話:
SELECT * FROM V$LOCK WHERE BLOCK=1;
通過查詢V$SESSION.BLOCKING_SESSION_STATUS,v$SESSION.BLOCKING_SESSION兩個字段也可以查看到阻塞其他的會話。
如果LMODE為0,REQUEST大于1,表示在獲取鎖的時候失敗,發生了相應鎖的阻塞。例如,在執行DML語句時,如果TYPE=TM,LMODE=0,REQUEST=3,就表示此DML語句在獲取表的TM鎖的行排它鎖時被阻塞,處于等待狀態。
查找阻塞事務的事務會話信息:
select * from v$lock where (id1,id2)=(select id1,id2 from v$lock where sid= 被鎖的會話的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的相關信息。
主要的有:
TM - DML enqueue
TX - Transaction enqueue
UL - User supplied
MR -Media Recovery
MR鎖用于保護數據文件,使得文件在數據庫打開、表空間Online時不能執行恢復。當進程對數據文件進行恢復時,需要排他的獲得MR鎖。當數據庫打開時,每個文件上都分配一個MR鎖。ID1代表文件號,也包含了201臨時文件。
從Oracle 11g開始,每個登錄的會話都會有一個默認的AE鎖。
LOCK MODE(按類型劃分)
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也能看出按類型分鎖只有2種,共享(S),排它(X),把他們不同的組合就成了不同的LOCK MODE了。如果添加的是X鎖,那么其他任何鎖也不能再添加到此行或表上了。
TM就是DML鎖,是表級上的鎖。TX是事務鎖,是行級鎖。在執行DML操作時,先對表加TM鎖,如果加鎖成功,然后再加TX鎖。一般情況下,一個會話中,只會出現一個TX鎖,可能有多個TM鎖,這些TM所共享一個TX鎖。不同的語句加TM鎖的類型不同,類型就是下面說的LOCK MODE。在表級上加了TM鎖也是為了防止其他會話再在表上加上排它鎖(例如對表執行DDL語句)。一個表上可以加上多個TM鎖、TX鎖的。例如,A會話更新了TEST表上ID號為1的一條記錄,首先會先在這個表上加上一個TM鎖,加鎖成功,會在ID為1的行上加上一個TX鎖。如果有另外一個會話來同樣來更新ID為1的記錄就會發生阻塞,因為加TM鎖能成功,但是加TX鎖失敗。如果更新的記錄是ID=2那么就是成功的。這是表上就存在多個TM、TX鎖。如果在表上加上TM鎖成功,那么除了在V$LOCK會有相應的記錄外,V$LOCKED_OBJECT也有相應對象的記錄。
行級鎖只有排他鎖沒有共享鎖。
另外,select語句不會添加任何鎖,所以一般的TX,TM鎖都不會阻塞select語句的執行。唯一能阻塞select語句執行的是latch鎖,一旦發生latch鎖阻塞select語句的執行,對系統的正常運行非常的大,甚至會導致系統的崩潰。
三.示例
示例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
有時候查詢v$LOCK會發現只有TM鎖,沒有TX鎖,那是因為在執行DML語句或select ...for update語句時操作的記錄是0條,所以只加上了TM鎖,沒有行需要加TX鎖。
四.手動添加鎖:
級別從低到高,SS可以添加除了X其他的所有類型的鎖。而X鎖不能添加其他任何的鎖。
創建索引時添加的是TM的S鎖,MODE值為4,這個時候是不允許執行任何的DML語句的,因為無法在表上添加任何其他排它類型的TM鎖。當然我們在創建索引時可以指定ONLINE關鍵字,可以避免阻塞DML語句情況的出現。
//行共享 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;
通過ROLLBACK或COMMIT來釋放鎖。
五.相關參數:
dml_locks=0(dml_locks相關含義請看另一篇文章: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: 無法獲得 DML 全表鎖定; DML_LOCKS 為 0
由此證明:如果dml_locks=0,那么執行dml語句,表級的TM鎖已經不存在了,但是行級別的TX事務鎖還是存在的。由于不能在表級上添加任何鎖,所以更無法執行DDL語句對表進行操作。
到此,相信大家對“Oracle的鎖機制原理”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。