我们有一个打印队列进程,它通过 dbms_lock.allocate_unique 获取用户锁。它执行工作,然后释放锁。该过程非常有效。
今天,我们有一个分配锁的进程,如 dbms_lock_allocated 的输出所示:
NAME LOCKID EXPIRATION
printer_lock 1073741825 11/30/2013 9:35:46 AM
无论会话有这并没有释放锁。有什么方法可以找到分配了这个锁的会话,这样我们就可以结束他们的会话并释放锁?
编辑:
查询 DBA_LOCKS 不会显示任何具有“PL/SQL 用户锁定”锁定类型的会话。
谢谢!
您所指的锁类型存储在 table (not view)
SYS.DBMS_LOCK_ALLOCATED
中。我相信他们只有一个“句柄”,但没有特定的所有者,即:他们都属于SYS
. 也就是说,如果您正在发生活动阻塞情况(有人在等待锁并且分配锁的会话没有释放它),那么这个查询可能会显示发生了什么:您可以从 获取此信息
DBA_LOCKS
。DBA_LOCKS
有SESSION_ID
和 锁ID。这些锁可以从 V$LOCK(或 RAC 的 GV$LOCK)中选择
1073741825
- 是表格中的lockid
列,dbms_lock_allocated
或者您可以通过dbms_lock.allocate_unique('YOUR_LOCK_NAME',:lock_id);