[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