Oracle-10g
如何通過 dbms_lock 找到誰分配了使用者鎖?
我們有一個列印隊列程序,它通過 dbms_lock.allocate_unique 獲取使用者鎖。它執行工作,然後釋放鎖。該過程非常有效。
今天,我們有一個分配鎖的程序,如 dbms_lock_allocated 的輸出所示:
NAME LOCKID EXPIRATION printer_lock 1073741825 11/30/2013 9:35:46 AM
無論會話有這並沒有釋放鎖。有什麼方法可以找到分配了這個鎖的會話,這樣我們就可以結束他們的會話並釋放鎖?
編輯:
查詢 DBA_LOCKS 不會顯示任何具有“PL/SQL 使用者鎖定”鎖定類型的會話。
謝謝!
這些鎖可以從V中選擇 $ LOCK (or GV $ RAC 的鎖定)
SELECT * FROM gv$lock WHERE lock_type = 'UL' AND '1073741825' like id1||'%'
1073741825
- 是表格中的lockid
列,dbms_lock_allocated
或者您可以通過dbms_lock.allocate_unique('YOUR_LOCK_NAME',:lock_id);
您所指的鎖類型儲存在 table (not view)
SYS.DBMS_LOCK_ALLOCATED
中。我相信他們只有一個“句柄”,但沒有特定的所有者,即:他們都屬於SYS
. 也就是說,如果您正在發生活動阻塞情況(有人在等待鎖並且分配鎖的會話沒有釋放它),那麼這個查詢可能會顯示發生了什麼:SELECT blocker.username blocker, blocker.sid blocker_session , blocked.username blocked, blocked.sid blocked_session FROM v$session blocked JOIN v$session blocker ON (blocked.blocking_session = blocker.sid) WHERE blocked.wait_class = 'Application' AND blocked.event='enq: UL - contention';