[firebase-br] Deadlock em trigger para atualizar estoque.

Magno System magnosysteminformatica em gmail.com
Qua Mar 17 14:07:29 -03 2010


Tenho uma STORED PROCEDURE que insere uma série de dados na tabela VENDAS. Na tabela VENDAS tem uma TRIGGER AFTER INSERT que atualiza o campo ESTOQUEATUAL da tabela de PRODUTOS.

Do ponto de vista transacional, estou deixando a transação aberta o mínimo de tempo possível. Eu capturo todos os produtos em uma tabela local, as formas de pagamento, e todos os demais dados que necessito para a execução da STORED PROCEDURE
e somente ao final da venda depois de tudo capturado eu abro a transação, executo a STORED PROCEDURE e já COMMITO a transação.

Pois bem, fazendo alguns testes aqui na empresa, eu abri uma venda e cadastrei 2 produtos diversas vezes, ou seja, a venda possuia mais ou menos 20 itens que na realidade era o produto 1 e o produto 2 cadastrado 10 vezes cada um em uma venda só.

Fiz isto no TERMINAL 1 e no TERMINAL 2. 

Fechei a venda, pressionando o BOTÃO ENTER simultaneamente nos dois terminais de forma que eles fechassem a venda ao mesmo tempo. Foi inevitável, deu DEADLOCK em um dos terminais.

Eu sei que eu simulei uma situação inusitada onde em uma venda com 20 itens era composta por 10 itens iguais do PRODUTO 1 e 10 itens iguais do PRODUTO 2 e isto fechando ao mesmo tempo de outro terminal com os itens cadastrados da mesma forma.

Eu consegui fazer uma rotina onde eu protejo o comando EXECPROC dentro de um TRY EXCEPT e em caso de DEADLOCK ele aguarda um segundo e executa novamente o EXECPROC (fiz em loop), por até 10 vezes, ou seja, 10 segundos no máximo de espera. Em testes isto se mostrou eficiente.

Gostaria da opinião de vocês.

Software House Magno System
Site: www.magnosystem.com.br
Email: magno em speet.com.br
Tel.: (35)3371-2337 / (35) 9129-7634


Mais detalhes sobre a lista de discussão lista