如何将 2 个 IBDatabase 设置为 1 个 IBTransaction?

How to set up 2 IBDatabase to 1 IBTransaction?

我在 DataModule 中有一个 IBDatabase 与我的 IBTransaction 链接。
在项目的一个模块中,我需要控制两个数据库中的持久化。

为此,我以这种方式添加第二个 IBDatabase:

constructor TConnections.Create(AIBDatabase: TIBDatabase);
begin
  if AIBDatabase = nil then
    raise Exception.Create('The base connection is needed!');
  inherited Create;
  FIBDatabase := TIBDatabase.Create(nil);
  FIBDatabase.LoginPrompt := false;
  FIBDatabase.Params.Clear;
  FIBDatabase.Params.Text := AIBDatabase.Params.Text;
  FIBDatabase.DatabaseName := AIBDatabase.DatabaseName.Replace('DB.GDB', 'DB2.GDB');
end;

procedure TConnections.SetTransaction(AIBTransaction: TIBTransaction);
begin
  if AIBTransaction = nil then
    raise Exception.Create('Then Transaction is needed!');
  AIBTransaction.AddDatabase(FIBDatabase);
  FIBDatabase.DefaultTransaction := AIBTransaction;
  FIBDatabase.Open;
end;

任何 select 命令都可以正常工作,但在插入命令中会发生错误。
嗯,我有这个:

connections := TConnections.Create(Dm.Database);
try
  connection.SetTransaction(Dm.Transaction);

  qry := TIBQuery.Create(nil);
  qry.Database := Dm.Database;
  try
    // here are commands with Dm.Transaction
    // ...
    qry.ExecSql;
  finally
    qry.Free;
  end;

  otherQry := TIBQuery.Create(nil);
  otherQry.Database := connection.OtherDatabase;
  try
    // here are commands with connection.OtherDatabase but same Transaction
    // ...
    otherQry.ExecSql;  // The error occurs here.
  finally
    otherQry.Free;
  end;

  Dm.Transaction.Commit;
finally
  connection.Free;
end;

'invalid transaction handle (expecting explicit transaction start)'

这些块包含在try except
所以,如果我再试一次,在错误之后,过程运行顺利。

我的配置有什么问题?

如果您明确开始交易,可能会发生这种情况。每个显式事务都必须显式完成。因此,如果您的连接明确打开,您应该明确关闭它。

您可以使用:

//Commit(Stop) the transaction before open an other connection
if Dm.Transaction.InTransaction then 
  dm.Transaction.Commit;

Note: In applications that connect an InterBaseExpress dataset to a client dataset, every query must be in its own transaction. You must use one transaction component for each query component.

http://docwiki.embarcadero.com/Libraries/XE8/en/IBX.IBDatabase.TIBTransaction