[firebase-br] Erro TransactionID invalido!!

Pineli carlospineli em gmail.com
Sex Mar 30 08:34:14 -03 2007


Ola para todos....
estou fazendo uma aplicacao com firebird 1.5 embarcado + delphi 7.
recebo centenas de eventos através de 1 sockets e preciso gravar tudo
no banco...
só que tudo acontece muito rápido e esta dando erro após a quinta
conexao. Qual uma maneira segura de gravar tudo com segurança... estou
fazendo assim:

tem um data modulo com a conexao
e cada conexao do socket cria uma thread com o codigo abaixo. Criando
um query tbm para cada.
O ID transacao estou gerando o valor aleatoriamente para tentar nao repetir
(...)

DM.SQLUltimoCod.Close ;
DM.SQLUltimoCod.Open  ;
codigonovo := inttostr( DM.SQLUltimoCod.Fields[0].AsInteger + 1);

//gravando informacao no banco de dados

SQLQueryThread.Close     ;  // Não sei se já tava aberta, então fecho
SQLQueryThread.SQL.Clear ;
SQLQueryThread.SQL.Add('INSERT INTO EVENTOS(ID_EVENTOS, EVENTO, IP) ');
SQLQueryThread.SQL.Add('VALUES('+CODIGONOVO+','+#39+COPY(RecText,1,4)+#39+','+#39+ClientSocket.RemoteAddress+#39+')')
;

Gravou := False;       // Controla se conseguiu ou não gravar
for i := 1 to 100 do   // Tentativa de gravação por 100 vezes
begin
    try
      TransacaoSQL.TransactionID := IDTransacao; //1;
      TransacaoSQL.IsolationLevel := xilREPEATABLEREAD ;
      DM.SQLConexao.StartTransaction( TransacaoSQL ) ;
      SQLQueryThread.ExecSQL( True ) ;
      DM.SQLConexao.Commit( TransacaoSQL ) ; // Efetiva gravação
      Gravou := True;   // Se chegou aqui é pq conseguiu gravar
    except
      on e:Exception do
      begin
         DM.SQLConexao.Rollback( TransacaoSQL ); // Desfaz alteraes
         Erro   := e.Message;
         Gravou := False    ;   // Faiô, tio!
      end;
    end;
    if Gravou then   // Conseguiu gravar, iupiiiii!
       break         // Sai do 'For'
    else
       Sleep(1000);  // Espera 1 segundo antes de ir p/ prox. passo do 'For'
end;
if not Gravou then   // Faiô mesmo, depois de 100 tentativas :-(
begin
   ShowMessage(Erro);   // Mostra mensagem de erro
(....)

quando ocorre o erro ele esgora as 100 tentativas....
Como fazer isso de uma forma mais segura??????




Mais detalhes sobre a lista de discussão lista