Fórum Transacoes DBExpress #331928

23/10/2006

0

Estou tentando usar DBExpress com Firebird e abandonar o IBO... mas estou esbarrando na seguinte situação: No IBO eu informo a qual Transacao a Query pertence... portanto, qualquer operação feita nesse query, só sera confirmada se ocorrer o Commit da Transacao...

Pois bem, no DBExpress eu nao informo a transacao que a query participa, eu apensa inicio a transacao e confirmo. Se eu iniciar a transacao, efetuar comandos sql e ja gravar entao o seguinte trecho é valido:

 

var
    Transacao: TTransactionDesc;
begin
    Transacao.TransactionID := 1;
    Transacao.GlobalID := 1;
    Transacao.IsolationLevel := xilREADCOMMITTED;

    SQLConnection.StartTransaction(Transacao);
    Query.ExecSQL;
    SQLConnection.Commit(Transacao);

end;


Agora, a situação é que eu quero iniciar a transacao, efetuar varias alterações e só depois confirmar. Nao td de uma vez só. A seguir o trecho que iniciaria a transacao:

// Variavel Global nesse caso !!!!
var
   Transacao: TTransactionDesc;
(...)

begin
    
    Transacao.TransactionID := 1;
    Transacao.GlobalID := 1;
    Transacao.IsolationLevel := xilREADCOMMITTED;

    SQLConnection.StartTransaction(Transacao);
end;



Depois de vários Updates, insert, deleletes, etc o seguinte treco iria dar Commit na Transacao:

    
     SQLConnection.Commit(Transacao);



Logicamente aparece o seguinte problema: Outras telas e outras alterações estariam ocorrendo ao mesmo tempo... Acontece que qd eu abro a transacao em uma tela e efetuo varias e varias alterações em qualquer outra, qd é confirmado o Commit da transacao todas as alterações serao confirmadas... Justamente pq nao consigo informar em qual das transacoes cada Query deve trabalhar... Ela trabalha em qualquer uma q esteja aberta.

Existe alguma forma de contornar isso? Ou realmente só será possivel trabalhar como no primeiro codigo que se inicia, efetua alterações e ja aplica o commit?

Pessoal. Desculpa pela pergunta gigantesca... Aguardo colaboração.


Capelari

Capelari

Responder

Posts

23/10/2006

Adriano Santos

Velhinho, dá uma olhada neste tópico que tem uma discussão boa sobre o assunto. Vais entender com certeza.

[url=http://forum.clubedelphi.net/viewtopic.php?t=58547&highlight=sqldataset+++clientdataset]Transações com DbExpress de forma Bidirecional[/url]


E mais algumas coisas sobre DBExpress:
[url=http://forum.clubedelphi.net/viewtopic.php?t=75031&start=0&postdays=0&postorder=asc&highlight=&sid=6c3d12b7f2e7a711939b7662cd0834db]dbExpress Interbase 6.5 Delphi 7.0[/url]
[url=http://forum.clubedelphi.net/viewtopic.php?t=75051]Mestre/Detalhe dbExpress[/url]

:wink: :wink:


Responder

Gostei + 0

24/10/2006

Macario

Ola.

Apenas uma duvida, da maneira que voce quer usando variavel global por quanto tempo voce mantem a transacao aberta? Isso nao gera problemas de deadLock para voce?


[]´s


Responder

Gostei + 0

24/10/2006

Adriano Santos

Ola. Apenas uma duvida, da maneira que voce quer usando variavel global por quanto tempo voce mantem a transacao aberta? Isso nao gera problemas de deadLock para voce? []´s


O [b:ca3578e8e7]Macario[/b:ca3578e8e7] tem razão. A transação deve ser o mais breve possível, senão dá xabú.


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar