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

Sam*_*uel 2 delphi dll database-connection transactions firedac

根据Embarcadero:

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

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

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

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

Vic*_*ria 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;
Run Code Online (Sandbox Code Playgroud)

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

FDConnection1.StartTransaction;
try
  DoSomething(FDConnection1.CliHandle);
  FDConnection1.Commit;
except
  FDConnection1.Rollback;
  raise;
end;
Run Code Online (Sandbox Code Playgroud)

现在,由于这样的代码执行,你将启动额外的嵌套事务,应用程序连接对象不知道(这是因为没有跟踪事务状态更改)因此对于DBMS,事务在该格式错误的DLL内部启动结束.这就是你需要照顾的东西.

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

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

类似地,当在DLL函数内改变隔离级别设置时,可以破坏例如由应用程序连接对象启动的事务的完成.