Commit em duas fases com dbExpress

Delphi

30/08/2007

olá pessoal!

Estou precisando usar commit em duas fases para atualizar/inserir em dois bancos de dados distintos. Alguém sabe como implementar isso?
Estou usando: Delphi 7, Firebird 2.0 e para fazer UPDATE, INSERT estou usando o TSQLDataSet da paleta dbExpress.

Se alguém puder me ajudar agradeço.


Adriano_ds

Adriano_ds

Curtidas 0

Respostas

Rodrigo_koga

Rodrigo_koga

30/08/2007

Vc pode usar o componente SQLConnection.

Vc pode fazer o seguinte:

SQLConnection.StartTransaction -> Para abrir uma transação;

SQLConnection.Commit -> Para salvar uma transação;

SQLConnection.Roolback -> Para não salvar uma transação, para voltar os dados a situação anterior da gravação dos dados;


GOSTEI 0
Adriano_ds

Adriano_ds

30/08/2007

Olá rodrigo_koga

Sim, mas eu preciso fazer isso em dois bancos de dados diferentes (cada um fica num micro diferente).
E preciso que as atualizações sejam feitas nos dois ou cancele tudo (commit em duas fases do Firebird). Vou ter dois TSQLConnection e apenas uma transação. Não sei se isto é possível com dbExpress?

Mas obrigado pela atenção, amigo.


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

30/08/2007

creio que isso não seja possível. mas acho que você pode controlar com uma variável. algo assim:

gravatransacao := false;

try
  inicia transacao banco1
  executa procedimentos banco 1

  gravatransacao := true;
except
  gravatransacao := false;
end;

if gravatransacao then
begin 
  try
    inicia transacao banco2
    executa procedimentos banco 2

    gravatransacao := true;
  except
    gravatransacao := false;
  end;
end;

if gravatransacao then
begin
  confirma transacao banco1
  confirma transacao banco2
end
else
begin
  if transacao banco 1 iniciada then
    desfaz transacao banco 1

  if transacao banco 2 iniciada then
    desfaz transacao banco 2
end



GOSTEI 0
Adriano_ds

Adriano_ds

30/08/2007

Olá emerson.en!

Obrigado por ajudar, amigo. Esta vai ser a solução que vou ter que usar caso não tehna como implementar commit em duas fases pelo Delphi.

Sei que o firebird tem o recurso. Só não sei se o Delphi e dbExpress suportam.

Será que teria outra forma de fazer commit em duas fases? Como por exemplo acessar a API do firebird?


GOSTEI 0
Beppe

Beppe

30/08/2007

Can I access this capability via - Delphi , using InterBase API Calls? - embedded SQL programs? When you start a transaction with the API, you specify a list of open database handles instead of just one. With ESQL, by default all transactions you start are multi-database, using all of the open databases, unless you limit the list with the USING clause.


Tvz vc pudesse derivar SQLConnection para poder tratar esta situação. Faça uma investigação e veja se vale a pena.


GOSTEI 0
POSTAR