1

这段代码有问题吗?
有时我会得到一个未处理的“无效事务对象”异常:

procedure BlaBla;
var
  TD: TDBXTransaction;
begin
  TD := SQLConnection.BeginTransaction;
  try
    SQLConnection.ExecuteDirect('some sql command');
    SQLConnection.ExecuteDirect('some sql command');
    SQLConnection.CommitFreeAndNil(TD);
  except
    SQLConnection.RollbackFreeAndNil(TD);
  end;
end;

这个异常是向用户提出的,所以我认为它是由 RollbackFreeAndNil 提出的,因为所有的休息都在 try..except 中。

我应该用另一个 try..except 来包装 RollbackFreeAndNil 吗?真是一团糟。

我正在使用 Delphi 2009、带有 Firebird 2.1 的 DBX 和 Devart 的驱动程序。

4

4 回答 4

4

如果 CommitFreeAndNil 抛出异常会发生什么?

将调用 RollbackFreeAndNil。那么TD有效吗?

你吃的是例外,因此是证据。不要那样做;重新抛出:

procedure BlaBla;
var
  TD: TDBXTransaction;
begin
  TD := SQLConnection.BeginTransaction;
  try
    SQLConnection.ExecuteDirect('some sql command');
    SQLConnection.ExecuteDirect('some sql command');
  except
    SQLConnection.RollbackFreeAndNil(TD);
    raise;
  end;
  SQLConnection.CommitFreeAndNil(TD);
end;
于 2009-01-07T14:12:32.043 回答
3

问题是如果 SQLConnection 未连接到数据库,则 SQLConnection.BeginTransaction 返回 nil。然后我得到了无效事务对象的异常。

我从没想过会这样。它应该尝试连接或引发异常。返回 nil 对我来说没有意义。

于 2009-03-03T19:17:04.473 回答
1

有时是您使用 cxdbmemo 之类的组件执行各种程序并给您错误。您必须删除该组件(或类似的东西)并正常进行交易。

于 2011-12-02T22:12:29.330 回答
0
SQLConnection.DBXConnection.BeginTransaction(TDBXIsolations.ReadCommitted);
于 2010-02-25T08:13:46.210 回答