Fórum Problema com Transação #370560

19/05/2009

0

Bom dia a todos!
var 
  MyTD : TTransactionDesc; 
begin 
  //- 
  MyTD.TransactionID  := 1; 
  MyTD.IsolationLevel := xilREADCOMMITTED; 
  Dm.MyDB.StartTransaction(MyTD); 
  try 
    //- Executando a Qry 
    MyQryBuscaX.Close; 
    MyQryBuscaX.Dataset.CommandText:= MySelect +  MyWHERE + MyGroupBy; 
    MyQryBuscaX.Open; 
    MyQryBuscaX.First; 
    
    //-- 
    while not MyQryBuscaX.Eof do 
      begin 
        //-- 1 
        Dm.Sis_ExecuteSql.Close; 
        Dm.Sis_ExecuteSql.Sql.Text := ´UPDATE SAL_NX SET NX_STATUSNF = ´ + QuotedStr(´L´) + ´ WHERE NX_ID = ´ + QuotedStr(IntToStr(MyQryBuscaX.Fields.Fields[0].AsInteger)); 
        Dm.Sis_ExecuteSql.ExecSQL(True); 

        //-- 2 
        Dm.Sis_ExecuteSql.Close; 
        Dm.Sis_ExecuteSql.SQL.Text := ´UPDATE SAL_NXI SET NXI_FKNX_STATUSNF = ´ + QuotedStr(´L´) + ´ WHERE NXI_NX_ID = ´ + QuotedStr(IntToStr(MyQryBuscaX.Fields.Fields[0].AsInteger)); 
        Dm.Sis_ExecuteSql.ExecSQL(True); 

        //-- 3 
        MyQryBuscaNXI.Close; 
        MyQryBuscaNXI.Dataset.CommandText := ´SELECT NXI_FKPRD_ID, NXI_VLR1, NXI_VLR2, NXI_VLR3 FROM SAL_NXI WHERE NXI_NX_ID =:CODIGO´;
        MyQryBuscaNXI.Dataset.ParamByName(´CODIGO´).AsInteger := MyQryBuscaX.Fields.Fields[0].AsInteger; 
        MyQryBuscaNXI.Open; 
        MyQryBuscaNXI.First; 

        //-- 4 
        while not MyQryBuscaNXI.eof do 
          begin 
            //- 
            Dm.Sis_ExecuteSql.Close; 
            Dm.Sis_ExecuteSql.SQL.Text := (Format(´UPDATE SAL_PRODUTO SET ¬s = ¬18.4f WHERE PRD_ID = ¬s´,[´PRD_VLR1´, MyQryBuscaNXI.Fields.Fields[1].AsFloat, IntToStr(MyQryBuscaNXI.Fields.Fields[0].AsInteger)])); 
            Dm.Sis_ExecuteSql.ExecSQL(True); 

            Dm.Sis_ExecuteSql.Close; 
            Dm.Sis_ExecuteSql.SQL.Text := (Format(´UPDATE SAL_PRODUTO SET ¬s = ¬18.4f WHERE PRD_ID = ¬s´,[´PRD_VLR2´, MyQryBuscaNXI.Fields.Fields[2].AsFloat, IntToStr(MyQryBuscaNXI.Fields.Fields[0].AsInteger)])); 
            Dm.Sis_ExecuteSql.ExecSQL(True); 

            Dm.Sis_ExecuteSql.Close; 
            Dm.Sis_ExecuteSql.SQL.Text := (Format(´UPDATE SAL_PRODUTO SET ¬s = ¬18.4f WHERE PRD_ID = ¬s´,[´PRD_VLR3´, MyQryBuscaNXI.Fields.Fields[3].AsFloat, IntToStr(MyQryBuscaNXI.Fields.Fields[0].AsInteger)])); 
            Dm.Sis_ExecuteSql.ExecSQL(True); 

            //- 
            MyQryBuscaNXI.Next; 
          end; 
        //-- 
        MyQryBuscaNX.Next; 
      end; 
      //-- 
      Dm.MyDB.Commit(MyTD); 
     //-- 
     TMyLib.My_MessageDlg(´Liberada com sucesso.´, mtInformation, [mbOK], mrOk, 0); 
  except 
    on E:EDatabaseError do 
      begin 
        if DM.MyDB.InTransaction then 
          begin 
            Dm.MyDB.Rollback(MyTD); 
            TMyLib.My_MessageDlg(´Não foi possível executar a liberação.´, mtInformation, [mbOK], mrOk, 0); 
          end; 
      end; 
end; 

O problema é o seguinte:
Se levanto uma excessão nas linhas dos comentários 1 ou dois, o rollback, ocorre normalmente. Mas se esta excessão ocorrer apartir do comentário 3, o rollback é executado mas as linhas dos comentários 1 e 2 são commitadas. E isto sem passar pelo Commit(debugando). Alguém tem alguma idéia da besteira que estou fazendo e não estou vendo?
Ficha técnica:
Firebird 2.0/DBExpress/BDS2006;
MyQryBuscaX,MyQryBuscaNXI:TSimpleDataset;
Sis_ExecuteSql: TSqlQuery
[]´s


Junior Miranda

Junior Miranda

Responder

Posts

19/05/2009

Abysmall

Olá Junior Miranda tudo bem?

Talvez seja o tipo do erro que você está tratando no except que do jeito que está o rollback acontece somente quando uma exception do tipo EDataBaseError acontece.

Se acontecer algum outro tipo de exceção não será executado o rollback.

Abraço.
Leandro.


Responder

Gostei + 0

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

Aceitar