[firebase-br] Firebird Congelado

Carlos Andrade krlosgilson em gmail.com
Seg Fev 13 12:52:24 -03 2017


Olá Gladiston, vou fazer exatamente isso pra ver se desvendo esse 
mistério de vez. No Delphi, uso os componentes da paleta dbexpress, em 
meu código não utilizo "commit" nas transações, é exatamente assim:


function InsertRecord(qrysql: TSqlQuery; msg_result: boolean; Table, 
Fields, Values: string): Boolean;
begin
   result := false;
   OpenConnection;
   with qrysql do
   begin
     Close;
     Sql.clear;
     Sql.add('insert into '+Table+' ('+Fields+') values ('+Values+')');
     ExecSql;
     result := true;
     if msg_result then
       Mensagem('Registro gravado com sucesso.',0);
   end;
   CloseConnection;
end;


E em alguns formulários utilizo ClientDataSet, a gravação dos registros 
é assim:

DM.CdsClientes.Append;
//Preenchimento dos campos aqui
DM.CdsClientes.Post;
DM.CdsClientes.ApplyUpdates(-1);


A sua Procedure "FormCloseQuery" se enquadra na forma com estou fazendo?


Em 13/02/2017 08:51, Gladiston Santana escreveu:
> Minha impressão é que uma transação ficou perdida, causando um tempo de
> aguardo até o desbloqueio, mas como está "perdida" dará dead lock no final
> do processo.
> Como há a impressão de "congelamento", ao parar o serviço e reiniciar, você
> acaba matando todos os processos, incluindo o causador, a transação
> pendente.
> Mas é temporário até que o processo repita novamente, teria de descobrir
> onde no programa abre uma transação que não culmine no commit.
> Temporariamente, você poderia colocar no seu programa, no onclose algo
> assim:
> procedure TfmXXXXX.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
> begin
>    try
>      Application.OnHint := nil;
>      if (dm.MyConn.Connected) then
>      begin
>        if Assigned(dm.MyConn.Transaction) then
>        begin
>          if dm.MyConn.Transaction.Active then
>          begin
>            dm.MyConn.Transaction.Commit;
>          end;
>        end;
>        if dm.FB_TRANSACTION_RW.Active then
>        begin
>          dm.FB_TRANSACTION_RO.Commit;
>        end;
>        if dm.FB_TRANSACTION_RO.Active then
>        begin
>          dm.FB_TRANSACTION_RO.Commit;
>        end;
>        if dm.MyConn.Connected then
>          dm.MyConn.Close;
>      end;
>    finally
>      CanClose:=true;
>    end;
> end;
>
> Algo que também poderia ser feito é escrever um arquivo de log de quando
> uma estação conectou seu app e quando desconectou, isso daria indicios de
> que tem um usuário matando seu app através do gerenciador de tarefas, algo
> que faria uma transação ficar eternamente aberta. As vezes o usuário
> (sempre ele), acha que um processamento tá demorando tempo demais, daí como
> ele é "hacker", aprendeu a matar a tarefa e iniciar de novo, algo que com o
> BD conectado não se deve fazer.
>
> Mas tudo isso é um chute, e um bom chute.
>
> Como o João Marcos disse, você é guerreiro e acredita até o fim.
>
> Vou ser franco com você, o que conseguiu até o momento é uma proeza que só
> conseguistes porque usa o principio da conexão e desconexão.
> Obteria resultados muito melhores com Datasnap, menos dor de cabeça e mais
> performance. A principio porque com o Datasnap, você trabalha offline até
> resolver fazer o sync com o banco, provavelmente numa ação de "Salvar" ou
> ao fechar o form.
>
> Não vale a pena aprender datasnap por autodidatismo, quebra muito a cabeça
> assim, vale mais a pena pagar por um curso online ou presencial(melhor) e
> por a mão na massa com a certeza do acerto.





Mais detalhes sobre a lista de discussão lista