Ir para conteúdo
Fórum Script Brasil

Murilo Sousa

Membros
  • Total de itens

    1
  • Registro em

  • Última visita

Posts postados por Murilo Sousa

  1. 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á!

×
×
  • Criar Novo...