Problema com Transação
Bom dia a todos!
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
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
Curtidas 0
Respostas
Abysmall
19/05/2009
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.
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.
GOSTEI 0