代码之家  ›  专栏  ›  技术社区  ›  Samuel

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

  •  2
  • Samuel  · 技术社区  · 7 年前

    根据Embarcadero:

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

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

    它表示,由于应用程序不跟踪DLL执行的状态更改,因此未指示处理DLL中的事务。有人能详细说明一下吗?

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

    1 回复  |  直到 7 年前
        1
  •  5
  •   Victoria zac    7 年前

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