Eu possuo um sistema feito em Delphi 7 + Firebird 2.5 com componentes de conexão da paleta InterBase.
Em uma das minhas rotinas, é realizada a baixa de estoque do produto através de Expedição de pedido de venda.
Estou com o seguinte problema: Ao fazer a expedição de um mesmo produto, simultaneamente, em terminais diferentes (e pedidos de venda diferentes), o sistema trava e logo após destravar exibe a seguinte mensagem de erro: "deadlock / concurrent transaction number is 14297". Segue o código:
IBTransAtualizacao.StartTransaction;
try
ExpedirItem(StrToInt(edtCodigo.Text)
,poItemExpedido.nQuantidade
,poItemExpedido.nQuantidadeUP
,cdsItensVendaITE_QTD_EXPEDIDO.AsFloat
,cdsItensVendaITE_QTD_UP_EXPEDIDO.AsFloat
);
IBTransAtualizacao.Commit;
except
on E: Exception do
begin
IBTransAtualizacao.Rollback;
MensagemFalha('Expedição não executada!');
end;
end;
Toda operação está ligada no mesmo Transaction (IBTransAtualizacao).
Dentro do método ExpedirItem, faço algumas consultas na tabela ANDAMENTO_ESTOQUE (Esta por sua vez armazena toda movimentação de estoque do sistema por produto) para poder recalcular o saldo do produto que está sendo expedido e assim poder dar baixa do mesmo no estoque (Atualizar o campo PRO_ESTOQUE da tabela PRODUTO).
O deadlock provavelmente ocorre porque ao consultar simultaneamente a tabela ANDAMENTO_ESTOQUE cruzando (JOIN) com a tabela PRODUTO, o firebird bloqueia o registro referente ao produto que está sendo expedido. Mas está tudo ligado na mesma transação. Alguém sabe como resolver o problema do deadlock? Como faço para trabalhar com "fila"? Ex: Caso a transação em um terminal tente acessar um registro que já está sendo utilizado por outro, o sistema aguarde até o registro ser "liberado"? A propriedade Params do IBTransAtualizacao está como:
Pergunta
Murilo Sousa
Boa tarde!
Eu possuo um sistema feito em Delphi 7 + Firebird 2.5 com componentes de conexão da paleta InterBase.
Em uma das minhas rotinas, é realizada a baixa de estoque do produto através de Expedição de pedido de venda.
Estou com o seguinte problema: Ao fazer a expedição de um mesmo produto, simultaneamente, em terminais diferentes (e pedidos de venda diferentes), o sistema trava e logo após destravar exibe a seguinte mensagem de erro: "deadlock / concurrent transaction number is 14297". Segue o código:
IBTransAtualizacao.StartTransaction;
try
ExpedirItem(StrToInt(edtCodigo.Text)
,poItemExpedido.nQuantidade
,poItemExpedido.nQuantidadeUP
,cdsItensVendaITE_QTD_EXPEDIDO.AsFloat
,cdsItensVendaITE_QTD_UP_EXPEDIDO.AsFloat
);
IBTransAtualizacao.Commit;
except
on E: Exception do
begin
IBTransAtualizacao.Rollback;
MensagemFalha('Expedição não executada!');
end;
end;
Toda operação está ligada no mesmo Transaction (IBTransAtualizacao).
Dentro do método ExpedirItem, faço algumas consultas na tabela ANDAMENTO_ESTOQUE (Esta por sua vez armazena toda movimentação de estoque do sistema por produto) para poder recalcular o saldo do produto que está sendo expedido e assim poder dar baixa do mesmo no estoque (Atualizar o campo PRO_ESTOQUE da tabela PRODUTO).
O deadlock provavelmente ocorre porque ao consultar simultaneamente a tabela ANDAMENTO_ESTOQUE cruzando (JOIN) com a tabela PRODUTO, o firebird bloqueia o registro referente ao produto que está sendo expedido. Mas está tudo ligado na mesma transação. Alguém sabe como resolver o problema do deadlock? Como faço para trabalhar com "fila"? Ex: Caso a transação em um terminal tente acessar um registro que já está sendo utilizado por outro, o sistema aguarde até o registro ser "liberado"? A propriedade Params do IBTransAtualizacao está como:
read_committed
no_rec_version
wait
Obrigado desde já!
Editado por Murilo SousaLink para o comentário
Compartilhar em outros sites
0 respostass a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.