Fórum DBEXPRESS - NÚMERO DAS TRANSAÇÕES #374372

31/08/2009

0

Olá colegas!

Tenho a seguinte dúvida a respeito do emprego de Transações.

Se meu programa (do lado cliente) está sendo executado em 3 máquinas...
E imaginando que 3 usuários estão a Alterar ao mesmo tempo...
Digamos... um Cliente cadastrado no BD.

No meu programa estou Iniciando a transação desta forma:

procedure TForm1.BtAlterarClick(Sender: TObject);
var
Transacao: TTransactionDesc;
begin
try
Transacao.TransactionID := 2001;
Transacao.IsolationLevel := xilREPEATABLEREAD;
SQLConnection1.StartTransaction(Transacao);
SQLDataSet1.Close;
SQLDataSet1.CommandType := ctQuery;
SQLDataSet1.CommandText := ´update Clientes set Nome = :pNome where Codigo = :pCodigo´;
SQLDataSet1.ParamByName(´pNome´).AsString := EdNome.Text;
SQLDataSet1.ParamByName(´pCodigo´).AsInteger := StrToInt(EdCodigo.Text);
SQLDataSet1.ExecSQL;
SQLConnection1.Commit(Transacao);
except
on Exc:Exception do
begin
ShowMessage(´Ocorreu um erro na tentativa de alteração do registro: ´ + Exc.Message);
SQLConnection1.Rollback(Transacao);
end;
end;

Então...
No caso a Transação é iniciada com o número ´2001´ nas 3 máquinas Clientes quando se vai Alterar um Determinado Cliente.
Isto é o correto?
Ou eu deveria gerar um numero único (criando uma função para gerar este numero único de Transação) para cada máquina Cliente poder Incluir, Alterar, Excluir os registros cadastrados?

Ex:

Transacao.TransactionID := 35458; (número gerado para alterar um Cliente apartir da a máquina 1)
Transacao.TransactionID := 46932; (número gerado para alterar um Cliente apartir da a máquina 2)
Transacao.TransactionID := 14324; (número gerado para alterar um Cliente apartir da a máquina 3)

E o mesmo eu teria que fazer para as Inclusões e Exclusões (gerar numeros únicos para cada transação)?

Ou devo apenas diferenciar os numeros das Transações (como estou fazendo atualmente) de acordo com o tipo das operações realizadas (independente da máquina cliente que inicia)...

Exemplo:

Inclusões de Clientes (transação = 1001), Inclusões de Cidades transação = = 1002), ... etc...

para as Alteração de Clientes (transação = 2001), Alteração de Cidades (transação = 2002) ... etc...

para as Exclusões de Clientes (transação = 3001), Exclusões de Cidades (transação = 3002)... etc...

Desculpem as redundâncias.
Grato desde já.


Userba

Userba

Responder

Posts

31/08/2009

P.rodrigo

Olá, você deve identificar cada operação com um código único. Se você criar números fixos para as operações, exemplo: 1001 para inclusões se dois usuários fizerem inclusão ao mesmo tempo e uam delas der erro, as duas serão canceladas qdo o sistema der o rollback, a parte o fato que ao tentar criar duas transações com o mesmo número o servidor sql irá retornar um erro.


Responder

Gostei + 0

31/08/2009

Userba

Olá, você deve identificar cada operação com um código único. Se você criar números fixos para as operações, exemplo: 1001 para inclusões se dois usuários fizerem inclusão ao mesmo tempo e uam delas der erro, as duas serão canceladas qdo o sistema der o rollback, a parte o fato que ao tentar criar duas transações com o mesmo número o servidor sql irá retornar um erro.


...

Valeu pela dica amigão.

...

Então...

Se cada transação, independente da Operação a ser realizada (Inclusão, Consulta, Exclusão), etc... deve ter um número único, seria uma boa ideia, gerar tais numeros de transações, tomando-se com base por exemplo: o IP da máquina onde o programa cliente está sendo executado (isto para programas que rodam apenas em redes locais)?

...

ou... se criar uma tabela de controle, com o fim de armazenar o numero da ultima transação (a que está sendo executada) de forma que se... por exemplo (uma inclusão, alteração, exclusão, etc... de um cliente), foi iniciada em outra máquina, antes se leria a transação atual na tabela de controle de transações, dai se geraria uma outra diferente, para só então se prosseguir com a tal operação?

...

grato se puder complementar a idéia.


Responder

Gostei + 0

01/09/2009

P.rodrigo

Cara..seguinte, vc nã precisa salvar número de transação em banco de dados naum...até pq, depois que vc der o commit na transação, aquele numero não vai mais te servir de nada. Aqui anempresa usamos números aleatórios. Você pode ver um exemplo muito bom numa das vídeos-aulas do grande Luciano Pimenta, num sistema complto de locadora. Numa das primeiras (não lembro bem qual o número) ele explica mito bem como fazer isso.
Falowz!


Responder

Gostei + 0

01/09/2009

Userba

Cara..seguinte, vc nã precisa salvar número de transação em banco de dados naum...até pq, depois que vc der o commit na transação, aquele numero não vai mais te servir de nada. Aqui anempresa usamos números aleatórios. Você pode ver um exemplo muito bom numa das vídeos-aulas do grande Luciano Pimenta, num sistema complto de locadora. Numa das primeiras (não lembro bem qual o número) ele explica mito bem como fazer isso. Falowz!


Valeu pela atenção.
Andei dando uma pesquisada na net.
Deu para ficar por dentro a respeito do uso de transações.
A solução que vou empregar é mesmo de gerar números aleatórios.
Vi soluções utilizando GUIDs... Handle da aplicação... Random... etc.
De qualquer forma vou ver se dou uma olhada na video-aula que citou.


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar