[firebase-br] Por favor, duvida em Transacao e Stored Procedure >>> melhor detalhada <<<

Antonio Carlos a.lima.silva em terra.com.br
Ter Ago 28 11:53:09 -03 2018


Oi Glauco, obrigado pelo retorno. 
Vou passar mais dados , o componente do tipo TSQLConnection esta dessa forma configurado :

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

Ou seja, waitonlocks=True creio eu deveria fazer o Firebird entender a transação no modo WAIT.

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;

A SP SP_PROCESA é pequena, o problema são as que são chamadas por elas, extensas, basicamente é assim que ela se comporta.

Tenho na verdade DUAS situações de erro, 

1 - ocorre erro é diz que a Stored Procedure SP_PROCESA esta em uso

2 - ocorre erro é diz que houve DEADLOCK e como podem ver, tem um Rollback e o procedimento que foi realizado antes do DeadLock não é revertido.

Vi algumas postagens dizendo que o que ocorre dentro de uma Stored Procedure, mesmo no contexto de uma transação não pode ser revertido.

Não parece ser muito lógico para um banco relacional

Pensei em TORNAR essa Stored Procedure em uma SP MONSTRO, ou seja tudo vai ser feito dentro dela , pois não sei se o fato dela chamar outras, coloca as demais fora do contexto da transação declarada.

O que acha ?

Outros colegas ( lista de programação ) disseram para chamar ela por uma trigger que seria disparada ao alterar uma condição no banco e que o FB ai sozinho se encarregaria do restante, isso é verdadeiro ?

Mas isso não seria o mesmo que eu fizesse assim, sem chamar explicitamente a transação :

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


Outros colegas me recomendaram a fazer assim, o que ate dá para fazer pois o FB é 2.5 ,mas penso que esse tipo de coisa seria usada apenas em ações que não preciso reverter como logs ou incrementos :


WHEN ANY DO
begin
IN AUTONOMOUS TRANSACTION DO
BEGIN
1 - VARIAVEIS RECEBEM VALORES DE SELECTS;

2 - EXECUTE PROCEDURE BAIXA_ESTOQUE;

3 - EXECUTE PROCEDURE LANCA_COMISSAO;

4 - EXECUTE PROCEDURE ATUALIZA_STATUS;
END

EXCEPTION EXSP_PROCESSA ;
end

Como pode ver, muitas opções e muita confusão.

Agradeço desde já sua ajuda.




Em Ter 28/08/18 06:37, Glaucos Ginez glaucosginez em gmail.com escreveu:
O problema deve estar nessa SP então, coloca ela no pastebin e manda o link
Em seg, 27 de ago de 2018 8:47 PM, Antonio Carlos <a.lima.silva em terra.com.br> escreveu:
Depois de ler o que postei anteriormente, percebi que ficou vago.

Ambiente : Firebird 2.5, Delphi XE com DBExpress ( sistema legado não posso mudar )

Em um dado ponto do sistema, onde existe a concretização da venda, preciso fazer toda a operação referente a lançamento de movimentação de itens, financeiro e etc.

Isso deve ser feito no contexto de transação onde havendo sucesso é feito um Commit e havendo erro um Roolback

Estou processando tudo através uma SP da seguinte forma :

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);
   finnaly
       FreeAndNil(sqlSP); 
   end
except
  Conn.RollbackFreeAndNil(T);   
end; 

São pedidos sempre diferentes, mas quando ocorre de haver na baixa em um pedido produtos iguais da DEADLOCK e parte é executa e parte não, mesmo havendo a transação declarada explicitamente.

Eu não entendo porque isso, pois entendo que deveria haver uma fila.

Poderiam por favor dar uma luz ?Obrigado.

______________________________________________
FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
Para saber como gerenciar/excluir seu cadastro na lista, use: http://www.firebase.com.br/fb/artigo.php?id=1107
Para consultar mensagens antigas: http://www.firebase.com.br/pesquisa_lista.html






Mais detalhes sobre a lista de discussão lista