[firebase-br] Deadlock
Sandro Souza
escovadordebits em gmail.com
Qui Maio 21 11:26:07 -03 2009
Bom dia/tarde Wilson.
Vou repetir o texto de outro post meu para um caso parecido:
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/21 Wilson Mota - GMail <wmotasjrp em gmail.com>
> Ola pessoal.
> Após gerado a mensagem abaixo, o que posso fazer para resolver esse
> problema de deadlock.
> "Lock conflict on no wait transaction deadlock update conflicts with
> concurrent update concurrent transaction numer is 249410"
> Obrigado
>
> Wilson.
> ______________________________________________
> 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