[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 10:03:07 -03 2010


Desculpe-me! Esqueci de informar.

Firebird 2.0/ BDS 2006/ Driver UIB 2.0 (Compilação do 1.5)

[]'s

--------------------------------------------------
From: "Renato Alves" <renato_br em bol.com.br>
Sent: Monday, August 16, 2010 9:38 AM
To: "FireBase" <lista em firebase.com.br>
Subject: Re: [firebase-br][OFF] Select dentro de uma transação utilizando o 
drive UIB está influenciando no rollback.

> 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
>
> ______________________________________________
> 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