Fórum Tem como fazer transação com o DBExpress? Tipo IBTransation #244719
27/07/2004
0
tem como eu fazer uma trasação tipo o IBTransaction com o DBExpress?
Orlando Frade
Curtir tópico
+ 0Posts
28/07/2004
Vinicius2k
Sim. Vc pode controlar explicitamente as transações, inclusive a mesma SQLConnection suporta várias transações em curso ao mesmo tempo, desde que tenham IDs distintas, diferentemente do IBX onde é necessário um IBTransaction para cada transação em curso...
Veja :
procedure TForm1.Button1Click(Sender: TObject); var TD: TTransactionDesc; begin try TD.TransactionID:= 1; TD.IsolationLevel:= xilReadCommited; SQLConnection1.StartTransaction(TD); SQLDataSet1.CommandText:= ´insert into CLIENTES(NOME,CIDADE,UF) values (:NOME,:CIDADE,:ESTADO)´; SQLDataSet1.ParamByName(´NOME´).AsString := ´VINICIUS´; SQLDataSet1.ParamByName(´CIDADE´).AsString := ´BICAS´; SQLDataSet1.ParamByName(´ESTADO´).AsString := ´MG´; SQLDataSet1.ExecSQL; SQLConnection1.Commit(TD); except on E:Exception do begin SQLConnection1.Rollback(TD); ShowMessage(Erro ao tentar incluir o registro : ´ + E.Message); end; end; end;
Apenas atente para o fato de que na arquitetura mais comum que é usando o DataSetProvider + ClientDataSet, num ApplyUpdates(0), por exemplo, a transação fica fora do seu controle e é controlada pela Midas... então ao se encadear vários ApplyUpdates de vários ClientDataSets, em caso de erro em algum, não será efetuado Rollback dos updates anteriores... Em resumo, só se pode controlar as transações no dbExpress se a instrução SQL for executada diretamente como no exemplo acima...
Espero ter ajudado...
T+
Gostei + 0
28/07/2004
Rômulo Barros
Parâmetros:
[b:379ea5fbd3][color=red:379ea5fbd3]Td.TransactionId :[/color:379ea5fbd3][/b:379ea5fbd3] Identificador único de cada transaçao e não pode ser igual a outro identificador de transaçao ativa pela DBExpress. Eu, particularmente, tenho um método que gera um número aleatório e adiciono este número no TransactionId.
[color=red:379ea5fbd3][b:379ea5fbd3]Td.IsolationLevel:[/b:379ea5fbd3][/color:379ea5fbd3] É o grau de isolamento das transações em relação a outras transações da DBExpress.
Pode ser:
[color=red:379ea5fbd3]xilReadCommited:[/color:379ea5fbd3] A transação atual apenas enxergará as modificações ´realmente´ efetuadas no Banco de Dados (Commit);
[color=red:379ea5fbd3]xilRepeaTableRead:[/color:379ea5fbd3] A transação atual enxergará apenas as transações finalizadas(commit) até o início desta transação;
[color=red:379ea5fbd3]xilDirtyRead:[/color:379ea5fbd3] A transação atual enxergará todas as modificações feitas por outra transação, mesmo que a mesma não tinha sido finalizada (commit)
[color=red:379ea5fbd3] Bibliografia: :arrow: [u:379ea5fbd3]Sistemas Multicamadas com Delphi, DataSnap e DBExpress - Anderson Haertel Rodrigues.[/color:379ea5fbd3][/u:379ea5fbd3]
Gostei + 0
28/07/2004
Orlando Frade
vocês me ajudaram muito.
Gostei + 0
28/07/2004
Rômulo Barros
vocês me ajudaram muito.[/quote:2616945acc]
:wink: :wink: :wink: :wink: :wink:
Gostei + 0
21/08/2006
Seu_madruga
Estou querendo passar minha aplicação 2 camadas para 3 camadas, onde o SQLconnection passaria a ficar no servidor de aplicação. Com isso, como eu faria para programar as transações já que o SQLconnection não é enchergado pela aplicação cliente?
Welav :D
Gostei + 0
21/08/2006
Seu_madruga
Estou querendo passar minha aplicação 2 camadas para 3 camadas, onde o SQLconnection passaria a ficar no servidor de aplicação. Com isso, como eu faria para programar as transações já que o SQLconnection não é enchergado pela aplicação cliente?
Welav :D
Gostei + 0
22/08/2006
Renatacoimbra
Neste tópico: http://forum.devmedia.com.br/viewtopic.php?t=58547
eu até fiquei feliz, e ainda ia testar essas exemplos usando o ClientDataSet, mais agora vc está falando que só tem como controlar a transacao usando DML.
parte do Código do tópico que vc respondeu:
var TudoOK: Boolean; Transacao: TTransactionDesc; begin TudoOK:= False; Transacao.TransactionID:= 1; Transacao.IsolationLevel:= xilReadCommitted; SQLConnection1.StartTransaction(Transacao); // Aplicando os updates if ClientDataSet1.ApplyUpdates(0) = 0 then if ClientDataSet2.ApplyUpdates(0) = 0 then if ClientDataSet3.ApplyUpdates(0) = 0 then if ClientDataSet4.ApplyUpdates(0) = 0 then TudoOK:= True; // Note que TudoOK só será true se não houver nenhum erro em nenhum dos Updates if TudoOK then begin SQLConnection1.Commit(Transacao); ShowMessage(´Atualizações OK.´); end else begin SQLConnection1.Rollback(Transacao); ShowMessage(´Ocorreram erros. Alterações descartadas.´); end; end;
[]´s
Gostei + 0
25/08/2006
Vinicius2k
Eu confesso que me expressei mal neste tópico que estamos e, portanto [b:d0ec51648c]considere como correta (e mais completa) a solução apresentada no tópico de que você retirou o trecho citado[/b:d0ec51648c].
O que eu quis dizer (mas não disse) ao final deste tópico é que se você não abrir/fechar as transações explicitamente, deixando a cargo da Midas fazê-lo, você não terá uma única transação para todos os updates que você encadear. Cada update terá uma transação e você não conseguirá desfazer todo o trabalho executado em caso de erros. O que difere o DBX do IBX (alvo da comparação inicial) onde todos os Datasets ligados ao mesmo IBTransaction têm suas operações dentro do contexto da mesma transação.
Em casos em que você não queira (ou não possa) encadear os updates dentro da mesma transação explícita, você deve executar diretamente as instruções SQL dentro de um controle transacional explícito por você.
T+
Gostei + 0
25/08/2006
Renatacoimbra
hun que bom que vc se expressou mal :)
Essa é uma soução interesante usando o DBX, já tive muitos problemas usando DBX com Midas sem transacao explicitas.
Obrigada por responder.
[]´s
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)