Ir para conteúdo
  • Cadastre-se

dev botao

Firebird 2.5 e Deadlock


Ver Solução Respondido por Antonio Carlos L,
  • Este tópico foi criado há 2280 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Postado

Por orientação do @Felipe E. Resende Mesquita estou abrindo esse tópico.

Tenho uma aplicação que usa um banco Firebird 2.5 em um servidor linux escrita em delphi XE e DBX ( não posso mudar a suite de conexão )

O componente do tipo TSQLConnection esta configurado dessa forma :

blobsize=-1
commitretain=False
waitonlocks=True
isolationlevel=ReadCommitted
trim char=False

e em dado ponto da execução é solicitado um processamento através do seguinte  comando

try
  sqlSP := TSQLStoredProc.Create(nil);
  try
    sqlSP.SQLConnection := Conn;
    T := Conn.BeginTransaction(TDBXIsolations.ReadCommitted);
    with sqlSP do
     begin
       StoredProcName := 'SP_PROCESSA';
       ParamByName('IN_DADOS').AsString := 'STRING DE PARAMETROS'
       ExecProc;
     end;  
    Conn.CommitFreeAndNil(T)
  finally
    FreeAndNil(sqlSP);
  end;
except
  Conn.RollbackFreeAndNil(T);
end;

Essa SP tem a seguinte extrutura

PROCEDURE SP_PROCESA(IN_DADOS)
/* PASSOS ILUSTRATIVOS */ 
BEGIN

1 - VARIAVEIS RECEBEM VALORES DE SELECTS;

2 - EXECUTE PROCEDURE BAIXA_ESTOQUE;

3 - EXECUTE PROCEDURE LANCA_COMISSAO;

4 - EXECUTE PROCEDURE ATUALIZA_STATUS;

END;

Eu estou com dois problemas :

1 - Ocorre um erro dizendo que a Stored Procedure esta em uso e nada é realizado o que é estranho pois se no Connection esta waitonlocks=True então penso que o Firebird entenda a transação como WAIT  .

2 - Ocorre um erro de Deadlock na SP e mesmo havendo um Rollback , algumas partes do que foi feito não voltavam.

Não existe nas SP secundárias um COMMIT e não sei se uma SP ao chamar outra considera o contexto da transação que a iniciou ou não.

Por isso muito no desepero, trouxe o codigo das demais para dentro da SP e acabei criando uma SP Monstro e TUDO ocorre dentro dela.

Em teste se simulo um lock e dou Rollback esta desfazendo.

Alguém já passou por isso e sabe contornar / tratar isso ?

Obrigado.

 

 

 

 

 

 

 

 

  • Curtir 1
  • Consultores
Postado
9 horas atrás, Antonio Carlos L disse:

1 - Ocorre um erro dizendo que a Stored Procedure esta em uso e nada é realizado o que é estranho pois se no Connection esta waitonlocks=True então penso que o Firebird entenda a transação como WAIT  

Qual é a mensagem exata de erro?

Já leu esse https://www.ibphoenix.com/resources/documents/how_to/doc_400?

9 horas atrás, Antonio Carlos L disse:

2 - Ocorre um erro de Deadlock na SP e mesmo havendo um Rollback , algumas partes do que foi feito não voltavam.

Você usa a cláusula SET TRANSACTION em algum lugar do seu BD? Como nesse link

Que partes voltam?

9 horas atrás, Antonio Carlos L disse:

não sei se uma SP ao chamar outra considera o contexto da transação que a iniciou ou não

De modo geral, considera.

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
Postado

Oi @EMBarbosa, muito obrigado pelo retorno.

Li os documentos indicado por você e vi que não deveria estar dando esse problema.

A mensagem de erro do uso concorrente da Stored Procedure eu não consegui de forma alguma reproduzir aqui, ocorre apenas em produção e é

SqlCode -904 , GdsCode 335544453, Erro : Object PROCEDURE SP_PROCESSA is in use

Não existe em nenhuma parte do código do banco SET TRANSACTION a transação é definida é no componente de conexão (waitonlocks=True ; isolationlevel=ReadCommitted) e a cada transação explicita (T := Conn.BeginTransaction(TDBXIsolations.ReadCommitted);)

Nessa pesquisa eu andei vendo um video , que existe parametros no Firebird, o servidor do cliente é Linux e eu não tenho acesso para ver o firebird.conf , mas é SuperServer pelo retorno, vou ver se mexer no tempo de espera ajuda.

 

 

 

 

 

 

.

 

 

  • Solution
Postado

Caro MODERADOR pode colocar como solução ao problema.

Depois de assistir o vídeo, experimentei remover a versão SuperServer e colocar a ClassicServer, mexi no firebird.conf para ajustar aos nucleos (4) , dobrei o valor dos semaforos, não mexi no restante e não teve mais retorno de erro.

O valor de consumo de memoria que no SS era de no máximo uns 400MB  aumentou muito, quase  2GB mas o server tem 4GB .

 

 

  • Curtir 1
  • Administradores
Postado

Obrigado por reportar.

Fechando. Para novas dúvidas, criar um novo tópico.

  • Curtir 1
Consultora SAC ACBr

Juliana Tamizou

Gerente de Projetos ACBr / Diretora de Marketing AFRAC
Ajude o Projeto ACBr crescer - Seja Pro

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.  Discord

Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil


Participe de nosso canal no Discord e fique ainda mais próximo da Comunidade !!

  • Consultores
Postado
Em 29/08/2018 at 09:19, Antonio Carlos L disse:

Nessa pesquisa eu andei vendo um video , que existe parametros no Firebird, o servidor do cliente é Linux e eu não tenho acesso para ver o firebird.conf , mas é SuperServer pelo retorno, vou ver se mexer no tempo de espera ajuda.

Essa dificilmente é a solução para o problema.

 

13 horas atrás, Antonio Carlos L disse:

Caro MODERADOR pode colocar como solução ao problema.

Depois de assistir o vídeo, experimentei remover a versão SuperServer e colocar a ClassicServer, mexi no firebird.conf para ajustar aos nucleos (4) , dobrei o valor dos semaforos, não mexi no restante e não teve mais retorno de erro.

O valor de consumo de memoria que no SS era de no máximo uns 400MB  aumentou muito, quase  2GB mas o server tem 4GB .

Que bom que resolveu. Mas na minha opinião é bem provável que tenha sido outra coisa...

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
  • Este tópico foi criado há 2280 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.
Visitante
Este tópico está agora fechado para novas respostas
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.