[firebase-br] Conflito de Updates

Sandro Souza escovadordebits em gmail.com
Qua Maio 20 11:41:19 -03 2009


Bom dia/tarde Alex.

Grande Alex, infelizmente dead locks são uma realidade em situações em que
há muita concorrência de alterações nas mesmas tabelas, como parece ser o
seu caso.

Nos casos em que me deparei com esse tipo de situação, eu tive que usar o
algoritmo de "matar pelo cansaço". :D

Seria algo mais ou menos assim:

// Laço infinito para efetuar os processamentos até conseguir.
repeat
  try
    // Inicia a transação.
    ...(StartTransaction;)
    // Faz todos os processamentos desejados.
    ...
    // Efetiva a transação.
    ...(Commit;)
    // Funcionou, pode sair do laço.
    break;
  except
    on E: Exception do
    begin
      // Cancela a transação atual.
      ...(Rollback;)
      // Não foi qualquer mensagem relativa á chave primária ou a algum
possível deadlock?
      if (Pos('deadlock', LowerCase(E.Message)) + Pos('pk_',
LowerCase(E.Message))) = 0 then
        // Propaga a exceção, já que se trata de uma situação não esperada.
        raise;
    end; // on Exception
  end; // try-finally
until False;

Dessa forma, consegui executar as operações que eu necessitava, insistindo
até conseguir, "matando pelo cansaço".

Essa idéia não serve apenas para o Firebird, serve para qualquer SGBD.

Espero ter ajudado mais que atrapalhado. :D

2009/5/20 Alex Miranda de Oliveira <alexsistemass em gmail.com>

>
> E Um deadLock so que não tem a mensagem completa
> mas vou conseguir e colocar aqui preciso muito resolver
> esses problemas de deadlock..
>
>
>
>
> 2009/5/20 Sandro Souza <escovadordebits em gmail.com>
>
> Bom dia/tarde Alex.
>>
>> Grande Alex, você poderia informar a mensagem completa de erro retornada
>> pelo banco de dados?
>>
>> Seria algum dead lock ou outro tipo de erro?
>>
>> Assim que você postar a mensagem completa de erro poderemos te ajudar.
>>
>> Ficamos no aguardo.
>>
>> 2009/5/20 Alex Miranda de Oliveira <alexsistemass em gmail.com>
>>
>>>  Criei no meu sistema algumas triggers para atualizar o saldo de credito
>>> do
>>> cliente
>>>
>>> so que as vezes ocorre conflito de updates ...
>>>
>>>
>>> Gostaria de saber como eu faço para que não ocorra conflitos de updates
>>> no
>>> sistema
>>> se teria jeito eu fazer um tratamento na trigger ou no sistema para que
>>> isso
>>> nao ocorra
>>>
>>>
>>> Eu uso delphi com firebird componentes de acesso a dados Fibplus
>>>
>>> Exemplo de Cenario:
>>>
>>>
>>> Quando se faz uma venda automaticamente a trigger e disparada para a
>>> atualizar o
>>> saldo de credito do cliente..
>>>
>>> so que quando ocorre este conflito acho que tem alguem usando o registro
>>> do
>>> cliente pelo cadastro do sistema ou por outra venda que disparou a
>>> trigger
>>>
>>> so iniciante em transações..
>>>
>>>
>>> Conto com a colaboração de voces...
>>> ______________________________________________
>>> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
>>> Para saber como gerenciar/excluir seu cadastro na lista, use:
>>> http://www.firebase.com.br/fb/artigo.php?id=1107
>>> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>>>
>>
>>
>



Mais detalhes sobre a lista de discussão lista