1、查看數據庫鎖,診斷鎖的來源及類型:
select object_id,session_id,locked_mode from v$locked_object
v$locked_object包含的是當前DB中被鎖住的OBJECT,session_id 可以關聯(lián)V$SESSION,object_id 可以關聯(lián) dba_objects。
locked_mode:
0:none
1:null 空
2:row-s 行共享(rs):共享表鎖,sub share
3:row-x 行獨占(rx):用于行的修改,sub exclusive
4:share 共享鎖(s):阻止其他dml操作,share
5:s/row-x 共享行獨占(srx):阻止其他事務操作,share/sub exclusive
6:exclusive 獨占(x):獨立訪問使用,exclusive
select b.owner,b.object_name,b.object_type,l.session_id,l.locked_mode
from v$locked_object l,
dba_objects b
where b.object_id=l.object_id
都字面意思,owner 擁有者、object_name 項目名稱、 object_type 項目類型。
select lpad(' ',decode(l.xidusn ,0,3,0))||l.oracle_username user_name,o.owner,o.object_name,o.object_type,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 order by o.object_id,xidusn desc;
查詢誰鎖的表及等待列表,第一行鎖、其余為等待列表。
2、找出數據庫的sid 和 serial#
據說v$locked_object 行級鎖以上才有記錄,v$lock記錄的是所有的鎖,包括系統(tǒng)鎖,利用v$lock一定要加上object_name,不然查出來一堆。
(1)利用 v$locked_object 查詢鎖
select t2.username,t2.sid,t2.serial#,t2.logon_time
from v$locked_object t1,
v$session t2
where t1.session_id=t2.sid order by t2.logon_time;
?。?)利用 v$lock 查詢鎖(注意把object_name修改一下,如果是行、表鎖,就是表名)
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='object_name';
3、殺死該session
alter system kill session 'sid,serial#'
用步驟2中查出來的記錄,對應進該語句刪除。如果刪除的時候提示 "ORA-00027:cannot kill current session",可能是自己窗口有數據沒有提交,檢查一下窗口列表,或者斷開數據庫連接,重新嘗試。
來自 http://www.rzrgm.cn/huchaoheng/p/hengc.html 修改
浙公網安備 33010602011771號