Почему иногда я получаю & # 8220; объект недействительной транзакции & # 8221; исключение?

StackOverflow https://stackoverflow.com/questions/420022

  •  05-07-2019
  •  | 
  •  

Вопрос

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

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.

Это было полезно?

Решение 2

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

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

Другие советы

Что бы произошло, если 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;

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

SQLConnection.DBXConnection.BeginTransaction(TDBXIsolations.ReadCommitted);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top