2

我有以下情况。

我们在 DelphiXE 中开发。我们将大部分功能放在一个 DATAMODULE 中。

function1(数据库,事务,paramInteger):float

例如function1取参数数据库(TIBDATABASE)、事务TIBTRANSACTION和附加参数整数。并返回一个浮点数

function  GetLastPretAch(DIBase : TIBDatabase; Tran : TIBTransaction; const aID : Integer) : Double;
var workQuery : TIBQuery;
begin
  try
    workQuery := TIBQuery.Create(Application);
    try
      workQuery.Close;
      workQuery.Database    := DIBase;
      workQuery.Transaction := Tran;
      workQuery.SQL.Clear;
      workQuery.SQL.Add('SELECT * FROM GETLASTPRETACH(-1, :AARTNR)');
      workQuery.ParamByName('AARTNR').AsInteger := aID;
      workQuery.Open;
      Result := workQuery.FieldByName('LASTPRET').AsFloat;
    except
      on e : Exception do begin
        raise EMagisterException.Create(TranslateIbError(e));
      end;
    end;
  finally
    FreeAndNil(workQuery);
  end;
end;

现在我想从一个线程中使用这个函数。这个线程安全吗?

inside execute procedure like
  ID := GetLastPretAch(database, transaction, 1);

是否线程安全?

4

2 回答 2

3

您的问题的答案是肯定的,您可以在工作线程的执行过程中使用该函数。您可能需要考虑改进您的 SQL 以仅选择字段 LASTPRET 而不是 SELECT *。

有关“线程安全”含义的扩展讨论,请参阅此 SO 问题 线程安全是什么意思?

于 2013-07-29T12:03:07.563 回答
0

看起来您正在使用 IBX 组件,我上次查看时绝对不是线程安全的。如果您切换到线程安全的数据访问层,您应该可以使用该代码。仅供参考 UIB(统一的 Interbase 组件)是线程安全的。

于 2013-07-30T12:54:11.187 回答