[firebase-br] Mais alguém testando FB4 com o Firedac no Delphi10.3.3?

Carlos H. Cantu listas em warmboot.com.br
Segunda Agosto 2 10:39:54 -03 2021


Savepoints fazem parte do Firebird, e permitem dar um rollback
"parcial" em uma transação. Creio que sejam usados inclusive no
tratamento de exceções no PSQL.

Como você disse que fazendo o processo diretamente no isql ou IBExpert
o problema não acontece, então possivelmente está relacionado a algo
no FireDac mesmo. Já testou com o IBO?

PS: O Vlad disse pra vc fazer uma aplicação simples demonstrando o
problema e abrir um ticket no tracker do Firebird anexando ela, para
que eles possam analisar se pode ser algum bug no FB.

[]s
Carlos H. Cantu
eBook Guia de Migração para o FB 3 - www.firebase.com.br/guiafb3.php
www.FireBase.com.br - www.firebirdnews.org - blog.firebase.com.br

GS> Não, a primeira exceção é planejada dentro da própria SP, exemplo:
GS> create or alter procedure  PROC_TESTE (...)
GS>      if (exists(
GS>         select 1 from custos_ativsub a
GS>         where a.descricao=:p_descricao
GS>       )) then
GS>       begin
GS>         --- Essa é uma exceção disparada dentro do programa e vai retornar
GS> a mensagem de erro que eu disser abaixo
GS>         exception ERR 'Ação solicitada ('||:p_acao||') '||
GS>           'não é permitida porque existe uma subatividade de mesmo nome
GS> "'||:p_descricao||'".';
GS>         suspend;
GS>         exit;
GS>       end
GS> (...)
GS> Daí meu programa com o código abaixo....
GS>      try
GS>        q1.Connection.StartTransaction;
GS>        q1.SQL.Add('select  result_value FROM PROC_TESTE(''BLABLA'')  ');
GS>        q1.SQL.Add(';');
GS>        q1.Open;
GS>        q1.Connection.Commit;
GS>      except
GS>        on e:exception do
GS>        begin
GS>          ELog('Erro: '+e.Message+' (operação desfeita)');
GS>          q1.Connection.Rollback;
GS>        end;
GS> end;
GS> ...O programa vai interceptar a exception, registrar o erro e dar o
GS> RollBack, mas o rollback em si mesmo retornará uma segunda mensagem de erro
GS> "firebird unable to find savepoint(...)" com uma numeração de savepoint,
GS> provavelmente criada artificialmente como "at savepoint231". Eu pesquisei
GS> bastante e o mais próximo que cheguei está aqui:

GS> https://firebirdsql.org/file/documentation/html/en/refdocs/fbdevgd30/firebird-30-developers-guide.html
GS> (...)Firedac1.Options.EnableNested: Controls nested transactions. The
GS> default value is True. Firebird does not support nested transactions as
GS> such but FireDac can emulate them using savepoints. For more details, see
GS> note(3) below.

GS> Essa "emulação" que o FDac faz me parece ser a origem do problema, mas em
GS> algum momento o Firedac do Delphi 10.3.x e resolveu tal problema porque
GS> nunca vi isso acontecer com o FB3 na época de migração, contudo parece ter
GS> voltado com o FB4. Me parece que posso resolver simplesmente desabilitando
GS> o tal "Firedac1.Options.EnableNested", mas se eu fizer isso poderei ter
GS> resultados inesperados em códigos muito antigos que funcionam perfeitamente
GS> bem. Então eu tô parando a homologação até concluir que a estrada à frente
GS> é perfeitamente segura para se chegar ao FB4.

GS> Obrigado pela ajuda.

GS> Em sáb., 31 de jul. de 2021 às 10:25, Carlos H. Cantu via lista <
GS> lista em firebase.com.br> escreveu:

>> Se vc chamar a mesma SP (provocando a exceção) pelo iSQL ou IBExpert,
>> etc. o Firebird tb retorna o mesmo erro quando vc manualmente dá
>> rollback?
>>
>>




Mais detalhes sobre a lista de discussão lista