v$lockv和$locked_object的區別

轉自:http://blog.itpub.net/31397003/viewspace-2144376/session

1、引言
工做中有次修改表sj_affair中的數據,須要禁用該表上的觸發器。結果沒法禁用,報以下錯誤:
ORA-00054: resource busy and acquire with NOWAIT specified
很明顯,是該表被鎖定了,因而打算kill掉鎖住該表的會話。步驟以下:

1.查出鎖住該表的會話id,serial#

SELECT o.object_name,s.sid, s.serial#
       FROM v$locked_object l, dba_objects o, v$session s
            WHERE l.object_id = o.object_id
                  AND l.session_id = s.sid
      AND o.object_name='SJ_AFFAIR';
      
2.kill掉該會話
alter system kill session 'sid, serial#';

kill掉會話以後再次查詢,發現該表上已經沒有鎖了。因而再次試圖禁用觸發器,結果奇怪了,仍是沒法禁用。
是否是鎖又恢復了呢?再次查詢,發現沒有鎖。這是爲何呢?
在網上搜了不少,發現一條有用的信息,做者查詢鎖用的是v$lock視圖,而不是v$locked_object視圖。改爲查詢v$locd視圖:

SELECT o.object_name,s.sid, s.serial#
       FROM v$lock l, dba_objects o, v$session s
            WHERE l.id1 = o.object_id
                  AND l.sid = s.sid
                  AND o.object_name='SJ_AFFAIR';
                  
而後再次查詢,發現SJ_AFFAIR上竟然還有鎖。因而再次kill,而後禁用觸發器就成功了。

2、V$LOCK和V$LOCKED_OBJECT
查詢鎖表都會用到V$LOCK和V$LOCKED_OBJECT,但這二者不是相同的。咱們先看看它們各自的主要字段:
1.v$lock
    sid:     會話SID,一般與v$session關聯。
    type:    鎖類型,TM表示表鎖或DML鎖,TX表示行鎖或事務鎖,UL表示用戶鎖。咱們主要關注TX和TM兩種鎖,其它均爲系統鎖,會很快自動釋放,不用關注。  行鎖不會單獨存,行級鎖以前須要先加表級共享鎖。
  lmode:     會話保持的鎖的模式。
 0=None;1=Null;2=Row-S (SS,行級共享鎖,其餘對象只能查詢這些數據行);3=Row-X (SX,行級排它鎖,在提交前不容許作DML操做);4=Share(共享鎖);5=S/Row-X (SSX,共享行級排它鎖);6=Exclusive(排它鎖)
           
ID1,ID2: ID1,ID2的取值含義根據type的取值而有所不一樣,對於TM 鎖ID1表示被鎖定表的object_id 能夠和dba_objects視圖關聯取得具體表信息,ID2 值爲0;對於TX 鎖,ID1以十進制數值表示該事務所佔用的回滾段號和事務槽slot number號,其組形式: 0xRRRRSSSS,RRRR=RBS/UNDO NUMBER,SSSS=SLOT NUMBER,ID2 以十進制數值表示環繞wrap的次數,即事務槽被重用的次數
    
2.V$LOCKED_OBJECT
   session_id:         會話id。一般與v$session關聯。
   object_id:          被鎖對象標識。一般與dba_objects關聯。
   oracle_username:    登陸oracle用戶名。
   os_user_name:       電腦用戶名如:Administrator
   locked_mode:        會話保持的鎖的模式。   
   
3、二者的區別
1.V$LOCKED_OBJECT只能報發生等待的表級鎖,不能報發生等待的行級鎖。
注:這句話是網上別人說的,暫時未驗證,需慎重考慮。可是從我遇到的問題來看,彷佛是正確的。只是個人問題已經沒法重現,也就失去了驗證它的機會。

2.v$locked_object包含的是當前DB中被鎖住的OBJECT,而v$lock不只包含用戶的,還包括系統被鎖住的object,即: V$LOCK>v$locked_objectoracle

相關文章
相關標籤/搜索