v$lockv和$locked_object的區別
一、引言
工作中有次修改表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,然後禁用觸發器就成功了。
二、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: 會話保持的鎖的模式。
三、兩者的區別
1.V$LOCKED_OBJECT只能報發生等待的表級鎖,不能報發生等待的行級鎖。
注:這句話是網上別人說的,暫時未驗證,需慎重考慮。但是從我遇到的問題來看,似乎是正確的。只是我的問題已經無法重現,也就失去了驗證它的機會。
2.v$locked_object包含的是當前DB中被鎖住的OBJECT,而v$lock不僅包含使用者的,還包括系統被鎖住的object,即: V$LOCK>v$locked_object
工作中有次修改表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,然後禁用觸發器就成功了。
二、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: 會話保持的鎖的模式。
三、兩者的區別
1.V$LOCKED_OBJECT只能報發生等待的表級鎖,不能報發生等待的行級鎖。
注:這句話是網上別人說的,暫時未驗證,需慎重考慮。但是從我遇到的問題來看,似乎是正確的。只是我的問題已經無法重現,也就失去了驗證它的機會。
2.v$locked_object包含的是當前DB中被鎖住的OBJECT,而v$lock不僅包含使用者的,還包括系統被鎖住的object,即: V$LOCK>v$locked_object
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31397003/viewspace-2144376/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- v$sql和v$sqlarea的區別SQL
- v-if和v-show的區別
- V$SQL 和V$SQLAREA區別SQL
- v$sysstat和v$sesstat區別
- v$metric和v$metric_history的區別
- v$sqlarea,v$sql,v$sqltext的區別和聯絡SQL
- v$sqlarea,v$sql,v$sqltext的區別和聯絡(zt)SQL
- dba_data_files和v$datafile的區別
- oracle鎖表問題處理 v$lock v$locked_objectOracleObject
- v$sql,v$sqlarea,v$sqltext區別SQL
- V$sql_text v$sqlarea v$sql 的區別SQL
- Oracle動態效能檢視學習之v$lock & v$locked_objectOracleObject
- (轉)學習Oracle動態效能表-(3)V$LOCK,V$LOCKED_OBJECTOracleObject
- v-if和v-show區別+元件通訊問題元件
- 學習動態效能表(八)-(3)-V$LOCKED_OBJECTObject
- v-html 、v-text({{}}) 、v-model的區別HTML
- ../和./和/的區別
- v$sqlarea,v$sql,v$sqltext三個檢視的區別SQL
- 和 的區別
- as 和 with的區別
- ||和??的區別
- /*和/**的區別
- LinkedList和ArrayList的區別、Vector和ArrayList的區別
- http和https的區別/get和post的區別HTTP
- 關聯v$session,v$locked_object,dba_objects查出鎖死會話及物件SessionObject會話物件
- 【SESSION】v$session and v$license 中sessions_current 的區別Session
- vue中v-model和.sync修飾符區別Vue
- 手機充電器5V2A和5V1A的區別,5V2A和5V1A充電器可以通用嗎?
- ./ 和sh 的區別
- JQuery this和$(this)的區別jQuery
- jquery $(this) 和this的區別jQuery
- T和?的區別
- ++a和a++的區別
- makefile =和:=的區別
- Mybatis中#{}和${}傳參的區別及#和$的區別小結MyBatis
- android之support-v4、v7、v13的區別Android
- 和區別
- 【檢視】V$BGPROCESS與V$PROCESS間的區別與聯絡