根据Embarcadero:
应用程序连接不跟踪执行的状态更改 DLL。因此,DLL应保留相同的事务状态 就像它在DLL调用之前一样。它表示不处理 DLL中的事务,更改事务隔离级别和 DLL中的其他设置。
http://docwiki.embarcadero.com/RADStudio/Tokyo/en/DLL_Development_(FireDAC)
它表示DLL中没有指示处理事务,因为应用程序不跟踪DLL执行的状态更改。有人可以详细说明吗?
如果我处理DLL中的事务,会发生什么?
答案 0 :(得分:5)
没什么特别的。将执行您在DLL内的共享连接对象上执行的事务操作。你应该小心,仅此而已。首先,您应该保持事务状态与DLL函数调用之前相同。第二件事是你不应该在DLL函数上下文中更改事务设置:
您可以自由地在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永远不会结束。这就是你需要照顾的东西。
如果针对这些情况实施了事务状态更改跟踪,则应用程序连接对象将知道该待处理事务并且可以完成它,例如,关闭连接时。
同样可以打破例如在DLL函数中更改隔离级别设置时,应用程序连接对象启动事务的完成。