[firebase-br] [OFF] Select dentro de uma transação utilizando o drive UIB está influenciando no rollback.

Junior Miranda jrmiran em gmail.com
Seg Ago 16 09:03:44 -03 2010


Senhores, bom dia!

Desculpem-me pela natureza OFF do post. Mas, é que já rodei por todos os lados e não encontrei nenhuma solução que não seja substituir o drive UIB. 
Mas infelizmente não posso fazer esta substituição neste momento. O problema é que como o select está dentro da transação e em loop, a cada volta, 
ele (o select), commita o(s) ExecSql anterior(es). Isto antes do commit propriamente dito. Então, quando há uma excessão, o rollback não funciona como devido. 
Quero garantir a atomicidade. Mas o bendito drive UIB não permite(Sob esta condição). Como não posso mudar o drive no momento, preciso encontrar uma 
alternativa(na aplicação). Mas até agora nada funcionou.

O código é este:
//------------
var 
T_ID1: TTransactionDesc; 
begin 
  //- 
  ClientDataSet1.Open; 
  ClientDataSet1.First; 
  //- 
  try 
    while not (ClientDataSet1.Eof) do 
      begin 
        //- 
        SqlQuery2.Close; 
        SqlQuery2.Sql.Text := 'SELECT CAB_NUM FROM CABECALHO WHERE CAB_ID = ' + QuotedStr(IntToStr(ClientDataSet1IT_FKCAB_ID.AsInteger)); 
        SqlQuery2.open; 

        ClientDataSet1.Edit; 
        ClientDataSet1IT_NUM.AsInteger  := SqlQuery2.Fields.Fields[0].AsInteger; 
        ClientDataSet1.Post; 

        //- 
        SQLQuery1.Close; 
        SQLQuery1.SQL.Text := 'UPDATE CABECALHO SET CAB_NUM =' + QuotedStr(IntToStr(SqlQuery2.Fields.Fields[0].AsInteger + 1)) +  ' WHERE CAB_ID =' + QuotedStr(IntToStr(ClientDataSet1IT_FKCAB_ID.AsInteger)); 
        SQLQuery1.ExecSQL(); 

        //- 
        ClientDataSet1.Next; 
      end; 
  //- 
  T_ID1.TransactionID  := 1; 
  T_ID1.IsolationLevel := xilREADCOMMITTED; 
  SQLConnection1.StartTransaction(T_ID1); 
  //- 
  if ClientDataSet1.ApplyUpdates(0) <> 0 then 
    Raise Exception.Create(''); 
  //- 
  SQLConnection1.Commit(T_ID1); 
  except 
    SQLConnection1.Rollback(T_ID1); 
  end;   
//-------
Onde há o objeto ClientDataset1, eu também já utilizei um terceiro TSqlQuery para fazer um update(Ou seja, só com objetos TSqlQuery). Alguém já passou por isso e conseguiu contornar a questão do select dentro de um laço em uma transação com Drive UIB? 

[]'s


Mais detalhes sobre a lista de discussão lista