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

Junior Miranda jrmiran em gmail.com
Qua Ago 18 10:41:08 -03 2010


Bom dia Renato!

Poderia me enviar este drive já compilado para teste? Baixei o source mas 
não consigo compilá-lo usando o 2006.

Att,

Júnior Miranda.

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

> Junior,
> Utilizo o driver UIB 2.1 em uma aplicação minha e não detectei
> este problema.
> Utilizo Delphi 7 e Firebird 2.1.
> Apesar que tive problema com o campo BIGINT no Firebird.
> Tenta seguir a orientação do Magno e posta ai o resultado.
> Fui
> Renato
>
>
>
> ----- Original Message ----- 
> From: "Magno System" <magnosysteminformatica em gmail.com>
> To: "FireBase" <lista em firebase.com.br>
> Sent: Monday, August 16, 2010 4:00 PM
> Subject: Re: [firebase-br][OFF] Select dentro de uma transação utilizando 
> o drive UIB está influenciando no rollback.
>
>
> Pelo cenário eu arriscaria dizer que o problema é mesmo com o DRIVE UIB.
>
> Eu tentaria uma das duas coisas:
>
> 1 - No DELPHI 7 / FB 2.0 o drive nativo funciona perfeitamente. Não sei se
> com o 2006 há alguma incompatibilidade.
>
> 2 - (Gambiarra, mas...) Crie uma nova conexão com o DBX e nesta nova 
> conexão
> use o drive nativo. Esta conexão serviria apenas para executar esta 
> rotina.
>
> Fora isto, não vejo outra forma a não ser trocar de driver mesmo.
>
>
> ----- Original Message ----- 
> From: "Junior Miranda" <jrmiran em gmail.com>
> To: "FireBase" <lista em firebase.com.br>
> Sent: Monday, August 16, 2010 3:40 PM
> Subject: Re: [firebase-br][OFF] Select dentro de uma transação utilizando 
> o
> drive UIB está influenciando no rollback.
>
>
> Na verdade não. Quando eu dou o start na transação tudo que é feito depois
> estará na transação até que eu commit ou rollback. Com o drive interbase,
> está mesma situação funciona 100%. O problema é que eu não poderei mudar o
> drive no momento. Então precisaria de uma alternativa para o drive UIB.
>
> ps. Obrigado por está dando atenção ao problema.
>
> ps. Se for colocado o start dentro bloco, provavelmente como não ocorrerá 
> um
> commit/rollback, eu terei um problemas relacionado a duplicidade de ID na
> transação ou algo
> parecido.
>
> []'s
>
> Júnior Miranda
>
> --------------------------------------------------
> From: "Eduardo Pombo" <eduardo em embras.net>
> Sent: Monday, August 16, 2010 3:29 PM
> 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.
>
>> ja neste ultimo exemplo a transacao esta fora do laco e com isso a 2a
>> e 3a volta estao sem transacao. acredito que teria q colocar o start
>> da transacao dentro do laco
>>
>>
>>
>> Em 16 de agosto de 2010 11:54, Junior Miranda <jrmiran em gmail.com> 
>> escreveu:
>>> Observem este código de um exemplo simples:
>>>
>>> var
>>> T_ID1: TTransactionDesc;
>>> begin
>>>  //-
>>>  T_ID1.TransactionID  := 1;
>>>  T_ID1.IsolationLevel := xilREADCOMMITTED;
>>>  SQLConnection1.StartTransaction(T_ID1);
>>>
>>>  //-
>>>  ClientDataSet1.Open;
>>>  ClientDataSet1.First;
>>>  //-
>>>  try
>>>   while not (ClientDataSet1.Eof) do
>>>     begin
>>>       //-
>>>       SqlQuery1.Close;
>>>       SqlQuery1.Sql.Text := 'SELECT CAB_NUM FROM CABECALHO WHERE CAB_ID 
>>> = '
>>> + QuotedStr(IntToStr(ClientDataSet1IT_FKCAB_ID.AsInteger));
>>>       SqlQuery1.open;
>>>
>>>       //-
>>>       SQLQuery2.Close;
>>>       SQLQuery2.SQL.Text := 'UPDATE ITENS SET IT_NUM =' +
>>> QuotedStr(IntToStr(SqlQuery1.Fields.Fields[0].AsInteger + 1)) +  ' WHERE
>>> IT_FKCAB_ID =' + 
>>> QuotedStr(IntToStr(ClientDataSet1IT_FKCAB_ID.AsInteger));
>>>       SQLQuery2.ExecSQL();
>>>
>>>       //-
>>>       SQLQuery3.Close;
>>>       SQLQuery3.SQL.Text := 'UPDATE CABECALHO SET CAB_NUM =' +
>>> QuotedStr(IntToStr(SqlQuery1.Fields.Fields[0].AsInteger + 1)) +  ' WHERE
>>> CAB_ID =' + QuotedStr(IntToStr(ClientDataSet1IT_FKCAB_ID.AsInteger));
>>>       SQLQuery3.ExecSQL();
>>>
>>>       //-
>>>       ClientDataSet1.Next;
>>>     end;
>>>  Raise Exception.Create('');
>>>  SQLConnection1.Commit(T_ID1);
>>>  except
>>>   SQLConnection1.Rollback(T_ID1);
>>>  end;
>>>
>>> O raise que estou utilizando para simular uma excessão, nos levará ao
>>> rollback. Mas digamos que 3 registros tenham sido alterados. O rollback 
>>> não
>>> alcança o dois primeiros.
>>> Explico:
>>> O select executado na segunda volta do laço, comitta os ExecSql
>>> anteriores(Executados na primeira volta). O select executado na terceira
>>> volta do laço, comitta os ExecSql anteriores(Executados na segunda 
>>> volta).
>>> Já na última volta, como chegamos ao final do laço, não ocorrerá um novo
>>> select. Com o raise, vamos ao except. Só que na verdade só existe um
>>> registro pendente (O último). Os dois primeiro foram commitados pela
>>> execussão do select. O select commita mas mantém a transação aberta. Com
>>> drive Interbase por exemplo, funciona normal! Ou seja, ao final, com  o
>>> raise, o rollback ocorrerá sobre todos os registro mencionados.
>>>
>>> []'s
>>>
>>> Júnior Miranda.
>>> --------------------------------------------------
>>> From: "Eduardo Pombo" <eduardo em embras.net>
>>> Sent: Monday, August 16, 2010 10:53 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.
>>>
>>>> Acredito que o problema seja pq no momento que o erro ocorre a
>>>> transacao ainda nao esteja criada.
>>>> ex: se o erro ocorrer neste item abaixo a transacao ainda nao foi
>>>> criada e ai vai para o except e com isso o rollback nao vai funcionar
>>>> por nao ter transacao criada.
>>>>
>>>>      ClientDataSet1.Edit;
>>>>      ClientDataSet1IT_NUM.AsInteger  :=
>>>> SqlQuery2.Fields.Fields[0].AsInteger;
>>>>      ClientDataSet1.Post;
>>>>
>>>> sugestao, mova o bloco abaixo para antes dos post e execsql.
>>>>
>>>> //-
>>>> T_ID1.TransactionID  := 1;
>>>> T_ID1.IsolationLevel := xilREADCOMMITTED;
>>>> SQLConnection1.StartTransaction(T_ID1);
>>>> //-
>>>>
>>>>
>>>>
>>>> Abraco,
>>>>
>>>> Espero ter ajudado
>>>>
>>>> Em 16 de agosto de 2010 09:03, Junior Miranda <jrmiran em gmail.com>
>>>> escreveu:
>>>>>
>>>>> 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
>>>>>
>>>>
>>>>
>>>>
>>>> --
>>>>
>>>> Atenciosamente
>>>>
>>>> José Eduardo Pombo de Barros
>>>> Gerente de Manutenção de Sistemas
>>>>
>>>> ______________________________________________
>>>> 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
>>>
>>
>>
>>
>> -- 
>>
>> Atenciosamente
>>
>> José Eduardo Pombo de Barros
>> Gerente de Manutenção de Sistemas
>>
>> ______________________________________________
>> 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
>
>
> ______________________________________________
> 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