Qual é a melhor maneira de evitar DeadLock
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.
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
Curtidas 0
Respostas
Mkoch
22/03/2006
Alguém ai utiliza transações???
GOSTEI 0
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
[]s
GOSTEI 0
Mkoch
22/03/2006
É estranho, tb uso ReadCommited.
GOSTEI 0
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.
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
22/03/2006
Aproveitando a deixa... Vinicius, qual a diferença do NoWait pro Wait?
[]s
[]s
GOSTEI 0
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.
Com ´wait´, a aplicação aguarda até que o registro seja destravado para executar a operação, sem gerar exceção.
GOSTEI 0
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
[]s
GOSTEI 0
Vinicius2k
22/03/2006
É ´eterno´... não há como configurar um tempo de espera.
GOSTEI 0
Martins
22/03/2006
Bom saber disso, informação nunca é d+, :D !!!!
GOSTEI 0
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
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
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.??
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
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.
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
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
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).
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