Ir para conteúdo
  • Cadastre-se

Firebird 2.5 e Deadlock


Ver Solução Respondido por Antonio Carlos L,
  • Este tópico foi criado há 2855 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
  • Consultores
Postado

Obrigado por reportar.

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

  • Curtir 1
Consultora ACBr Pro

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á 2855 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.

The popup will be closed in 10 segundos...
The popup will be closed in 10 segundos...