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中的事务,会发生什么?
没什么特别的.将执行您在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;
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内部启动结束.这就是你需要照顾的东西.
如果为这些情况实施了事务状态更改跟踪,则应用程序连接对象将知道该挂起的事务并且可以完成它,例如在关闭连接时.
类似地,当在DLL函数内改变隔离级别设置时,可以破坏例如由应用程序连接对象启动的事务的完成.
| 归档时间: |
|
| 查看次数: |
599 次 |
| 最近记录: |