Почему иногда я получаю & # 8220; объект недействительной транзакции & # 8221; исключение?
Вопрос
Что-то не так с этим кодом?
Иногда я получаю необработанный " Неверный объект транзакции " исключение в нем:
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);