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

时间:2018-02-01 13:14:46

标签: delphi dll transactions database-connection firedac

根据Embarcadero:

  

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

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

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

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

1 个答案:

答案 0 :(得分:5)

没什么特别的。将执行您在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函数中更改隔离级别设置时,应用程序连接对象启动事务的完成。