Почему иногда я получаю исключение "Недопустимый объект транзакции"? - PullRequest
1 голос
/ 07 января 2009

Что-то не так с этим кодом?
Иногда я получаю необработанное исключение «Недопустимый объект транзакции»:

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.

Должен ли я обернуть RollbackFreeAndNil еще одной попыткой ... кроме? Какой беспорядок.

Я использую Delphi 2009, DBX с Firebird 2.1 и драйвером Devart.

Ответы [ 4 ]

4 голосов
/ 07 января 2009

Что бы произошло, если 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;
3 голосов
/ 03 марта 2009

Проблема в том, что SQLConnection.BeginTransaction возвращает nil, если SQLConnection не подключен к базе данных. И тогда я получаю исключение недопустимого объекта транзакции.

Я никогда не ожидал этого. Следует попытаться подключиться или вызвать исключение. Возвращать ноль не имеет смысла для меня.

1 голос
/ 03 декабря 2011

иногда вы выполняете процедуры varius с таким компонентом, как cxdbmemo, и выдает ошибку. Вы должны удалить этот компонент (или что-то в этом роде) и выполнить свою транзакцию в обычном режиме.

0 голосов
/ 25 февраля 2010
SQLConnection.DBXConnection.BeginTransaction(TDBXIsolations.ReadCommitted);
...