Oracle-10g

如何通過 dbms_lock 找到誰分配了使用者鎖?

  • April 21, 2016

我們有一個列印隊列程序,它通過 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';

引用自:https://dba.stackexchange.com/questions/53644