Fórum O que acontece com a transação quando a estação trava? #52182
12/08/2005
0
oi pessoal. estou com a seguinte dúvida:
na parte de entrada de notas do meu sistema, na hora de gravar, eu dou um ApplyUpdates no ClientDataSet e depois executo uma Stored Procedure para atualizar o campo média dos produtos. Eu criei um bloco para evitar que a nota fosse gravada incorretamente. Exemplo abaixo:
try
ClientDataSet1.ApplyUpdates(0);
with IBSQL1 do
begin
if not Transaction.Active then Transaction.StartTransaction;
SQL.Clear;
SQL.Add(´EXECUTE PROCEDURE SP_CALCULAMEDIA;´);
ExecQuery;
Transaction.Commit;
end;
except
ShowMessage(´Erro ao gravar!´);
IBTransaction1.RollBack;
end;
ps.: ClientDataSet1->Provider->IBDataSet1->Transaction é a mesma transação que IBSQL1.Transaction;
com isso a qualquer momento que aconteça um problema para gravar os dados eu mando abortar tudo e eu não corro o risco de gravar a nota sem executar a stored.
mas a minha dúvida é a seguinte: e se depois de, por exemplo, dar o applyupdates o computador travar, o que acontece com a transação? O bloco except não pôde ser executado por causa do travamento e o commit não chegou a acontecer porque travou antes. O que o Firebird faz com essa transação?
na parte de entrada de notas do meu sistema, na hora de gravar, eu dou um ApplyUpdates no ClientDataSet e depois executo uma Stored Procedure para atualizar o campo média dos produtos. Eu criei um bloco para evitar que a nota fosse gravada incorretamente. Exemplo abaixo:
try
ClientDataSet1.ApplyUpdates(0);
with IBSQL1 do
begin
if not Transaction.Active then Transaction.StartTransaction;
SQL.Clear;
SQL.Add(´EXECUTE PROCEDURE SP_CALCULAMEDIA;´);
ExecQuery;
Transaction.Commit;
end;
except
ShowMessage(´Erro ao gravar!´);
IBTransaction1.RollBack;
end;
ps.: ClientDataSet1->Provider->IBDataSet1->Transaction é a mesma transação que IBSQL1.Transaction;
com isso a qualquer momento que aconteça um problema para gravar os dados eu mando abortar tudo e eu não corro o risco de gravar a nota sem executar a stored.
mas a minha dúvida é a seguinte: e se depois de, por exemplo, dar o applyupdates o computador travar, o que acontece com a transação? O bloco except não pôde ser executado por causa do travamento e o commit não chegou a acontecer porque travou antes. O que o Firebird faz com essa transação?
Djorius
Curtir tópico
+ 0
Responder
Posts
13/08/2005
Afarias
|com isso a qualquer momento que aconteça um problema para gravar
|os dados eu mando abortar tudo e eu não corro o risco de gravar a nota
|sem executar a stored.
Na verdade vc corre o risco SIM pq o código não está correto.
O código correto seria:
Note q o StartTransaction deve vir ANTES do ApplyUpdates.
|mas a minha dúvida é a seguinte: e se depois de, por exemplo, dar o
|applyupdates o computador travar, o que acontece com a transação?
É perdida.
T+
|os dados eu mando abortar tudo e eu não corro o risco de gravar a nota
|sem executar a stored.
Na verdade vc corre o risco SIM pq o código não está correto.
O código correto seria:
with IBSQL1 do begin if not Transaction.InTransaction then Transaction.StartTransaction; try ClientDataSet1.ApplyUpdates(0); SQL.Clear; SQL.Add(´EXECUTE PROCEDURE SP_CALCULAMEDIA;´); ExecQuery; Transaction.Commit; except Transaction.RollBack; ShowMessage(´Erro ao gravar!´); end; end;
Note q o StartTransaction deve vir ANTES do ApplyUpdates.
|mas a minha dúvida é a seguinte: e se depois de, por exemplo, dar o
|applyupdates o computador travar, o que acontece com a transação?
É perdida.
T+
Responder
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)