Pesquisar na Comunidade
Mostrando resultados para as tags ''deadlock''.
Encontrado 1 registro
-
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á!