Qual é a melhor maneira de evitar DeadLock

Delphi

22/03/2006

Qual é a melhor forma e configurações etc, para evitar deadlock Delphi 7 com IBX e Firebird 1.5 mais de 5 estações clientes ao mesmo tempo as vezes com duas ligadas já da este erro.
Error Message:
----------------------------------------
Unsuccessful execution caused by system error that does not preclude successful execution of subsequent statements.
lock conflict on no wait transaction.
deadlock.
update conflicts with concurrent update.


Mkoch

Mkoch

Curtidas 0

Respostas

Mkoch

Mkoch

22/03/2006

Alguém ai utiliza transações???


GOSTEI 0
Titanius

Titanius

22/03/2006

Olá, eu uso como ReadCommited, e por enquanto não tive esse problema.. mais de 45 maquinas quase ao mesmo tempo e nada...


[]s


GOSTEI 0
Mkoch

Mkoch

22/03/2006

É estranho, tb uso ReadCommited.


GOSTEI 0
Vinicius2k

Vinicius2k

22/03/2006

Colega,

O único segredo para não ter [i:ea00af9929]DeadLocks[/i:ea00af9929] é utilizar sempre transações curtas.
Penso que você precisaria revisar o projeto quanto às transações para não mais ter este problema.
Se suas transações já forem curtas e, pelo que pude observar, você está utilizando as transações em modo ´nowait´. *Talvez*, dependendo da forma como você está manipulando os dados, o modo ´wait´ fosse mais indicado. Se a edição de um mesmo registro por diversos usuários for constante, uma espera de alguns décimos de segundo poderia fazer o problema desaparecer.


GOSTEI 0
Titanius

Titanius

22/03/2006

Aproveitando a deixa... Vinicius, qual a diferença do NoWait pro Wait?


[]s


GOSTEI 0
Vinicius2k

Vinicius2k

22/03/2006

Com ´nowait´, se o registro estiver travado, imediatamente é disparada uma exceção na aplicação.
Com ´wait´, a aplicação aguarda até que o registro seja destravado para executar a operação, sem gerar exceção.


GOSTEI 0
Titanius

Titanius

22/03/2006

Esse Wait, tem algum delay? tipo, ele fica la a vida toda esperando ou depois de um tempo ele trava.

[]s


GOSTEI 0
Vinicius2k

Vinicius2k

22/03/2006

É ´eterno´... não há como configurar um tempo de espera.


GOSTEI 0
Martins

Martins

22/03/2006

Bom saber disso, informação nunca é d+, :D !!!!


GOSTEI 0
Etate

Etate

22/03/2006

Olá !

O deadlock é causado quando duas transações concorrentes ficam uma aguardando a outra acabar e vice-versa. Isto ocorre devido a sequencia de operações nas tabelas serem invertidas exemplo, a Trans1 faz update na Tab1 seguido da Tab2 e a Trans2 na Tab2 seguida da Tab1, com isso uma fica esperando a outra.
Uma forma de solucionar o problema é identificar quais as operações que entraram no deadlock e analizar o codigo para que eles tenham a mesma sequencia de operação.

Isso tambem pode ocorrer em uma única tabela, nos casos em que as transações alteram registros da tabela de forma invertida.

Até mais,
Everton


GOSTEI 0
Thomaz_prg

Thomaz_prg

22/03/2006

Mas Vinicius, me esclarece uma dúvida....
Se eu definir minha transação no IBX com wait e setar na propriedade IDleTimer um valor por exemplo, 2000, após o tempo setado em IdleTimer, a exceção é retornada a aplicação estou certo??

Ou seja, seria um tempo máximo para tentativas, mesmo usando Wait.??


GOSTEI 0
Vinicius2k

Vinicius2k

22/03/2006

thomaz_prg,

Estou meio ´enferrujado´ no IBX, mas, que eu me recorde, a propriedade IdleTimer de TIBTransaction, determina quanto tempo aguardar, porém não gera exceção.
Quando atingido o tempo limite, a ação determinada na propriedade DefaultAction é executada.
Funciona como um indicador de ociosidade, e não se aplica a uma transação ´commitada´ que está aguardando e sim a uma transação aberta que está pendente de commit ou rollback.


GOSTEI 0
Titanius

Titanius

22/03/2006

thomaz_prg, Estou meio ´enferrujado´ no IBX, mas, que eu me recorde, a propriedade IdleTimer de TIBTransaction, determina quanto tempo aguardar, porém não gera exceção. Quando atingido o tempo limite, a ação determinada na propriedade DefaultAction é executada. Funciona como um indicador de ociosidade, e não se aplica a uma transação ´commitada´ que está aguardando e sim a uma transação aberta que está pendente de commit ou rollback.


Opa.. aproveitando... o que você usa vinicius para firebird?


[]s


GOSTEI 0
Vinicius2k

Vinicius2k

22/03/2006

No momento, dbExpress + driver para IB da Borland e testando/estudando a aquisição do [url=http://www.devrace.com/en/fibplus/]FIB+[/url] ou driver da [url=http://www.upscene.com]Upscene[/url] para FB.

Mas tenho muitos projetos já realizados com IBX e devo utilizá-lo em um novo projeto com o FB Embeded (o dbExpress não se comporta de forma estável com o FB Embeded).


GOSTEI 0
POSTAR