Temos a necessidade de garantir que apenas uma cópia de uma determinada procedure esteja rodando no Oracle. Se já estiver em execução e um usuário tentar abrir outro, deve ocorrer um erro.
Qual é o melhor método de fazer isso?
Temos a necessidade de garantir que apenas uma cópia de uma determinada procedure esteja rodando no Oracle. Se já estiver em execução e um usuário tentar abrir outro, deve ocorrer um erro.
Qual é o melhor método de fazer isso?
Você pode fazer isso com
DBMS_LOCK
e um bloqueio exclusivo.Veja o seguinte procedimento:
Teste (sessão 1):
(Obviamente retorna quando
DBMS_LOCK.sleep()
retorna).Teste (sessão 2):
Obviamente você precisa
GRANT EXECUTE ON DBMS_LOCK TO YOURUSER;
.Use uma tabela de 'bloqueio'.
Quando o procedimento começar, verifique a tabela em busca de um valor conhecido, se presente, não prossiga e saia do proc. Se não estiver lá, escreva o valor na tabela, execute o procedimento, exclua o valor e saia normalmente.
Quando meus clientes têm uma solicitação com lógica de negócios exclusiva como esta, tento inverter a questão e perguntar por que isso é necessário.
A melhor maneira de garantir que apenas uma cópia esteja em execução é não permitir que os usuários executem o procedimento. Se este procedimento é tão especial então seu uso deve ser restrito a dba/developers.
Outra maneira é executar esse procedimento apenas como um trabalho. Adicione uma verificação no procedimento para ver se algum trabalho que chama isso está em execução. Se estiverem, interrompa o processamento e registre a ocorrência.