Fórum Tem como fazer transação com o DBExpress? Tipo IBTransation #244719

27/07/2004

0

Amigos,
tem como eu fazer uma trasação tipo o IBTransaction com o DBExpress?


Orlando Frade

Orlando Frade

Responder

Posts

28/07/2004

Vinicius2k

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 :
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+


Responder

Gostei + 0

28/07/2004

Rômulo Barros

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]


Responder

Gostei + 0

28/07/2004

Orlando Frade

Valeu.
vocês me ajudaram muito.


Responder

Gostei + 0

28/07/2004

Rômulo Barros

[quote:2616945acc=´Orlando Frade´]Valeu.
vocês me ajudaram muito.[/quote:2616945acc]

:wink: :wink: :wink: :wink: :wink:


Responder

Gostei + 0

21/08/2006

Seu_madruga

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


Responder

Gostei + 0

21/08/2006

Seu_madruga

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


Responder

Gostei + 0

22/08/2006

Renatacoimbra

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:


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


Responder

Gostei + 0

25/08/2006

Vinicius2k

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+


Responder

Gostei + 0

25/08/2006

Renatacoimbra

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


Responder

Gostei + 0

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

Aceitar