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

Renato Alves renato_br em bol.com.br
Seg Ago 16 09:38:24 -03 2010


Bom dia
Qual versão do Delphi e do drive UIB?
Renato


----- Original Message ----- 
From: "Junior Miranda" <jrmiran em gmail.com>
To: "FireBase" <lista em firebase.com.br>
Sent: Monday, August 16, 2010 9:03 AM
Subject: [firebase-br] [OFF] Select dentro de uma transação utilizando o 
drive UIB está influenciando no rollback.


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
______________________________________________
FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
Para saber como gerenciar/excluir seu cadastro na lista, use: 
http://www.firebase.com.br/fb/artigo.php?id=1107
Para consultar mensagens antigas: http://firebase.com.br/pesquisa 





Mais detalhes sobre a lista de discussão lista