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



根据Embarcadero:

应用程序连接不跟踪由 执行的状态更改 DLL。因此,DLL 应保留相同的事务状态 就像在 DLL 调用之前一样。表示不要处理 DLL 中的事务,更改事务隔离级别和 DLL 中的其他设置。

http://docwiki.embarcadero.com/RADStudio/Tokyo/en/DLL_Development_(消防DAC)

它表示未指示处理 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;

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

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

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

类似地,当从 DLL 函数中更改隔离级别设置时,例如,当应用程序连接对象启动的事务的完成时,可能会中断。

最新更新