Tem como fazer transação com o DBExpress? Tipo IBTransation
Amigos,
tem como eu fazer uma trasação tipo o IBTransaction com o DBExpress?
tem como eu fazer uma trasação tipo o IBTransaction com o DBExpress?
Orlando Frade
Curtidas 0
Respostas
Vinicius2k
27/07/2004
Orlando,
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 :
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+
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
Rômulo Barros
27/07/2004
Para isso, adicione na cláusula Uses de sua Unit a biblioteca ´[color=red:379ea5fbd3]DBXpress[/color:379ea5fbd3]´
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]
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
Orlando Frade
27/07/2004
Valeu.
vocês me ajudaram muito.
vocês me ajudaram muito.
GOSTEI 0
Rômulo Barros
27/07/2004
[quote:2616945acc=´Orlando Frade´]Valeu.
vocês me ajudaram muito.[/quote:2616945acc]
:wink: :wink: :wink: :wink: :wink:
vocês me ajudaram muito.[/quote:2616945acc]
:wink: :wink: :wink: :wink: :wink:
GOSTEI 0
Seu_madruga
27/07/2004
Opa,
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
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
Seu_madruga
27/07/2004
Opa,
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
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
Renatacoimbra
27/07/2004
Oi Vinicius, vir em outros tópicos seus falando sobre transacao com DBX, usando Cds.ApplyUpdates(0), não cheguei a testar, mais vc afirmava que tinha como controlar a transação.
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:
[]´s
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
Vinicius2k
27/07/2004
Renata,
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+
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
Renatacoimbra
27/07/2004
Oi Vinicius !
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
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