事情是這麼發生的:當天網絡很差,一個簡單的查詢語句都會卡一下,在完成一個存儲過程以後點擊編譯,plsql就卡住了。在等待了一段時間後,plsql仍是沒有響應,我覺得是網絡太卡致使,就直接結束了plsql的進程,準備從新登錄(如今看這麼作仍是有待商榷的)。等到我再次登錄編譯後,plsql就再次卡死,以後又嘗試了好幾回,每次都是一編譯就卡死。sql
既然這個問題已經能夠進行復現,而且同一個數據庫另外一個用戶登錄正常,就能夠基本排除是網絡波動形成。因而首先判斷是有鎖,因而使用了數據庫
SELECT l.session_id sid,
s.serial#,
l.locked_mode,
l.oracle_username,
l.os_user_name,
s.machine,
s.terminal,
o.object_name,
s.logon_time,
p.SPID
FROM v$locked_object l, all_objects o, v$session s,v$process p
WHERE l.object_id = o.object_id
AND l.session_id = s.sid
AND s.paddr = p.addr
ORDER BY sid, s.serial#;
複製代碼
進行查詢,可是卻沒有查詢到任何記錄。 接着利用bash
select * from dba_ddl_locks
複製代碼
進行查詢,如果只是想查詢特定對象,能夠加where name='XXX'
進行篩選,可是這裏我是想看一下到底多少資源在鎖,因此沒有加條件。 這個語句的查詢很是慢,一開始我覺得網絡又出問題了,後來等了一會才返回結果。網絡
利用這個語句就查詢到了那個存儲過程的確是存在鎖。利用kill將sessionkill掉session
select sid,serial# from v$session where sid=XXX;
alter system kill session 'XXX,XXXXXX';
複製代碼
再次執行編譯,成功。。oracle
V$LOCKED_OBJECT中只能查詢到DML鎖,DDL鎖是查詢不到的, 經過dba_ddl_locks能夠查詢到數據庫中 的ddl鎖,其實dml鎖一樣能夠經過dba_dml_locks視圖進行查詢,在每次發現有鎖的時候要區分鎖的種類進行查詢。ui