Stored procedure e rollback
Bom dia,
Estou com um problema para desfazer as operações realizadas no banco de dados (Delphi 7 com Firebird 2.1 e dbexpress). Em uma rotina utilizo um componente clientdatase e uma stored procedure para gravar alguns dados no banco. Entretando, quando simulo um erro, o primeiro registro inserido pela SP não é desfeito. Segue abaixo o código utilizado.
E também não é desfeita a inclusão do 1º registro se utilizar somente a stored procedure conforme abaixo.
Estou com um problema para desfazer as operações realizadas no banco de dados (Delphi 7 com Firebird 2.1 e dbexpress). Em uma rotina utilizo um componente clientdatase e uma stored procedure para gravar alguns dados no banco. Entretando, quando simulo um erro, o primeiro registro inserido pela SP não é desfeito. Segue abaixo o código utilizado.
var
SQLTrans: TTransactionDesc;
...
try
SQLTrans.IsolationLevel := xilREADCOMMITTED;
SQLTrans.TransactionID := 1;
SQLConnection.StartTransaction(SQLTrans);
// inclui um registro pelo clientdataset
ClientDataSet1.Append;
...
ClientDataSet1.Post;
// inclui 1º registro atraves de uma SP
SQLStoredProc1.Params.ParamByName('Campo1').Value := valor1;
SQLStoredProc1.Params.ParamByName('Campo2').Value := valor2;
...
SQLStoredProc1.ExecProc;
// inclui 2º registro atraves de uma SP
SQLStoredProc1.Params.ParamByName('Campo1').Value := valor1;
SQLStoredProc1.Params.ParamByName('Campo2').Value := valor2;
...
SQLStoredProc1.ExecProc;
// erro simulado
raise Exception.Create('Erro teste de rollback');
if ClientDataSet1.ApplyUpdates(0) > 0 then
raise Exception.Create('Erro na atualização do cds');
SQLConnection.Commit(SQLTrans);
except
on E: Exception do
begin
ClientDataSet1.CancelUpdates;
SQLConnection.Rollback(SQLTrans);
ShowMessage(E.Message);
end;
end;
E também não é desfeita a inclusão do 1º registro se utilizar somente a stored procedure conforme abaixo.
var
SQLTrans: TTransactionDesc;
...
try
SQLTrans.IsolationLevel := xilREADCOMMITTED;
SQLTrans.TransactionID := 1;
SQLConnection.StartTransaction(SQLTrans);
// inclui 1º registro atraves de uma SP
SQLStoredProc1.Params.ParamByName('Campo1').Value := valor1;
SQLStoredProc1.Params.ParamByName('Campo2').Value := valor2;
...
SQLStoredProc1.ExecProc;
// inclui 2º registro atraves de uma SP
SQLStoredProc1.Params.ParamByName('Campo1').Value := valor1;
SQLStoredProc1.Params.ParamByName('Campo2').Value := valor2;
...
SQLStoredProc1.ExecProc;
// erro simulado
raise Exception.Create('Erro teste de rollback');
SQLConnection.Commit(SQLTrans);
except
on E: Exception do
begin
SQLConnection.Rollback(SQLTrans);
ShowMessage(E.Message);
end;
end;
Luiz Bertolazzi
Curtidas 0