[firebase-br] ID de Transacao em DbExpress, contribuição e ...

Antonio Carlos a.lima.silva em terra.com.br
Sáb Jul 29 08:58:39 -03 2006


Caros companheiros de lista,
Na literarura encontramos diversos exemplos de como realizar transações com 
o DbExpress. Contudo, todos esses exemplos fundamentam-se em um ambiente 
Local ou onde apenas uma estacao acessa a base de dados pois utiliza um 
TransactionID := 1
Na prática em uma aplicação multiusuario ao manter esse exemplo clássico 
acabamos por receber diversas mensagens de erro do firebird informando que a 
transação ja existe com esse ID.

Eu usei o seguinte metodo para resolver isso :

i := 0;
while i = 0 then i := Randon(6500);
TransactionID := i;

Outra forma que um companheiro em uma lista delphi demonstrou foi :

function NewTransactionID: LongWord;
var
  lGUID: TGUID;
begin
  CreateGUID(lGUID);
  Result := lGUID.D1;
end;

Ocorre que a cada numero gerado ocorre uma pequena probabilidade de ser 
gerado em outra estação ( imagine onde existam muitas ) de ser gerado o 
mesmo numero , e isso aconteceu comigo em um cliente.

Me sugeriram n formas de gerar um id unico ( IP, IP+Hora, etc.. ) a que eu 
mesmo encontrei foi :

TransactionID := Application.Handle em Delphi 7 ou TransactionID := 
HInstance em D2005

Isso resolve a questão do ID da transação realmente ? Veja que cada estacão 
irá ter esse ID diferente , mas ele não ira variar na estacão. Por lógica , 
se abro a transação e fecho com um Id 123456 e novamente abro a transação e 
fecho com um Id 123456 teoricamante não haverá problemas .

O que os companheiros podem acrescentar ?

Antonio Carlos












Mais detalhes sobre a lista de discussão lista