[firebase-br] [OFF] Select dentro de uma transação utilizando o drive UIB está influenciando no rollback.
Magno System
magnosysteminformatica em gmail.com
Seg Ago 16 16:00:43 -03 2010
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
Mais detalhes sobre a lista de discussão lista