应用程序和 DLL 之间的共享 Firedac 连接中的事务

Transaction in shared Firedac Connection Between an Application and a DLL

据 Embarcadero 称:

The application connection does not track state changes performed by the DLL. Therefore, the DLL should preserve the same transaction state as it had before the DLL call. It is indicated not to handle transactions in a DLL, change the transaction isolation level and other settings in a DLL.

http://docwiki.embarcadero.com/RADStudio/Tokyo/en/DLL_Development_(FireDAC)

它表示未指示在 DLL 中处理事务,因为应用程序不跟踪 DLL 执行的状态更改。有人可以详细说明吗?

如果我在 DLL 中处理事务,会发生什么情况?

没什么特别的。将执行您在 DLL 内的共享连接对象上执行的事务操作。你应该小心点,仅此而已。首先,您应该保持事务状态与 DLL 函数调用之前相同。第二件事是您不应该从 DLL 函数上下文中更改事务设置:

1。保持相同的交易状态

您可以自由地在 DLL 中自己显式处理事务,但建议您不要这样做,因为您可能会犯错误。想象一个 DLL 函数,它错误地只启动了一个事务:

procedure DoSomething(Handle: Pointer); stdcall;
var
  Connection: TFDConnection;
begin
  Connection := TFDConnection.Create(nil);
  try
    Connection.SharedCliHandle := Handle;
    Connection.Open;
    Connection.StartTransaction;
  finally
    Connection.Free;
  end;
end;

您的应用程序将执行此操作:

FDConnection1.StartTransaction;
try
  DoSomething(FDConnection1.CliHandle);
  FDConnection1.Commit;
except
  FDConnection1.Rollback;
  raise;
end;

现在,由于执行此类代码,您将启动额外的 nested transaction 应用程序连接对象不知道(这是因为未跟踪事务状态更改)因此对于 DBMS ,在该格式错误的 DLL 中启动的事务永远不会结束。所以这就是你需要照顾的。

如果为这些情况实施了事务状态更改跟踪,应用程序连接对象将知道该未决事务并可以完成它,例如关闭连接时。

2。保留事务隔离级别和其他设置

同样可以打破例如从 DLL 函数中更改隔离级别设置时,完成由应用程序连接对象启动的事务。