[firebase-br] DeadLock on LINUX server

Gladiston Santana gladiston em vidy.com.br
Seg Jun 19 09:34:20 -03 2017


A principio pela mensagem de erro, não é um erro.
Quando mais de uma pessoa tenta acessar um recurso (ex um registro) que
está em uso por outra pessoa, a mensagem então aparece.

A resolução do programa envolve entender a tela em que isso acontece e que
tipo de isolamento se precisa ali.
Por exemplo, se for um relatório ou pesquisa, talvez a leitura do tipo
dirty read ou snapshot seja conveniente porque não faria esse tipo de lock.
Mas se for uma tela de bilhetagem, um readcommit - que as vezes é chamado
de lock pessimista - seria conveniente porque daria essa mensagem de erro
que reportou quando duas ou mais pessoas tentassem comprar um bilhete cuja
compra ja esta em andamento por outra pessoa. Seu exemplo usa esse tipo de
isolamento.
Usar o lock pessimista em todas as telas pode gerar um sistema mal
programado onde o usuário sai para tomar um café e essa mensagem de erro
aparece para os demais. Ou então um relatórios enquanto ainda estão em
preparação faz os demais terem de esperar o termino para prosseguir com um
COUNT, SUM e coisas do mundo SQL. Mas só sistemas mal programados são assim.

inte+
PS: O servidor ser Linux ou Windows pode apenas ser uma triste
coincidencia. Não sei se o modo classic ou superserver teria efeitos
diferentes em ambos os sistemas, mas verifique se o modo é o mesmo nos dois
sistemas.

Em 14 de junho de 2017 16:17, diego abib <diego em bredas.com.br> escreveu:

> Olá, migrei uma pequena aplicação que tenho do Delphi 7 para o Delphi XE e
> as Transações quando estão rodando em um servidor LINUX começaram a dar
> Erro de:  SQL Server Error: /lock conflict on no wait transaction/.
> deadlock.
>
> A mesma aplicação quando roda em servidor WINDOWS não dá a mensagem de
> erro.
>
> Estou usando o firebird 2.07 com DBEXpress.
>
> No Delphi faço da seguinte forma:
>
>
>    transacao : TDBXTransaction;
>
>    if connection.InTransaction then
>      exit;
>    transacao := connection.BeginTransaction(TDBXIsolations.ReadCommitted);
>      execução de comandos;
>    connection.CommitFreeAndNil(Transacao);



Mais detalhes sobre a lista de discussão lista