Temos um processo de fila de impressão que adquire um bloqueio de usuário via dbms_lock.allocate_unique. Ele executa o trabalho e depois libera a trava. O processo funciona muito bem.
Hoje, temos um processo que alocou um bloqueio, conforme visto nesta saída de dbms_lock_allocated:
NAME LOCKID EXPIRATION
printer_lock 1073741825 11/30/2013 9:35:46 AM
Qualquer sessão que tenha isso não liberou o bloqueio. Existe alguma maneira de encontrar a sessão que alocou esse bloqueio, para que possamos encerrar a sessão e liberar o bloqueio?
EDITAR:
Consultar DBA_LOCKS não mostra nenhuma sessão com o tipo de bloqueio 'PL/SQL User Lock'.
Obrigado!
O tipo de bloqueio ao qual você está se referindo é armazenado na tabela (não na exibição)
SYS.DBMS_LOCK_ALLOCATED
. Acredito que tenham apenas um "handle", mas não um dono específico, ou seja: todos pertencem aSYS
. Dito isso, se você tiver uma situação de bloqueio ativo acontecendo (alguém está esperando pelo bloqueio e não está sendo liberado pela sessão que alocou o bloqueio), esta consulta pode mostrar o que está acontecendo:Você pode obter essas informações em
DBA_LOCKS
.DBA_LOCKS
tem oSESSION_ID
e o id de bloqueio.Esses bloqueios podem ser selecionados em V$LOCK (ou GV$LOCK para RAC)
1073741825
- élockid
a coluna dadbms_lock_allocated
tabela ou você pode obtê-la pordbms_lock.allocate_unique('YOUR_LOCK_NAME',:lock_id);