Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Firebird, InterBase Новый топик    Ответить
 OO API FB3 Освобождение объекта транзакции после rollback  [new]
Tonal
Member

Откуда: Новосибирск
Сообщений: 90
Нужно ли вызывать release() после rollback?

ITransaction имеет интерфейс IReferenceCounted, следовательно нуждается в вызове release() после окончан6ия использования.
Но, если смотреть в примеры, можно заметит следующий шаблон использования:
ITransaction* tra = NULL;
...
tra->commit(&status);
tra = NULL;
...
if (tra)
  tra->release();

Из чего можно заключить, что после commit вызывать release() не нужно.

Но вызовов rollback в примерах нету.
Напрашивается мысля, что действовать нужно но аналогии с commit.
Или я не прав?
26 сен 17, 12:56    [20823542]     Ответить | Цитировать Сообщить модератору
 Re: OO API FB3 Освобождение объекта транзакции после rollback  [new]
hvlad
Member

Откуда:
Сообщений: 9318
Tonal,

commit и rollback уменьшают счётчик ссылок, release после них вызывать не нужно.

release нужен если
1. была получена дополнительная ссылка на объект
2. commit\rollback завершился с ошибкой (например коннект уже помер) и нужно очистить память клиента

PS Насколько я помню, rollback не даёт ошибок

PPS С курсорами, запросами, аттачем - всё так же
26 сен 17, 13:03    [20823580]     Ответить | Цитировать Сообщить модератору
 Re: OO API FB3 Освобождение объекта транзакции после rollback  [new]
Arioch
Member

Откуда:
Сообщений: 9144
Tonal
tra->commit(&status);


hvlad
release нужен если .... commit\rollback завершился с ошибкой


Результат функции проверять не нужно, там будет C++ exception брошен обязательно ?
26 сен 17, 13:27    [20823665]     Ответить | Цитировать Сообщить модератору
 Re: OO API FB3 Освобождение объекта транзакции после rollback  [new]
Tonal
Member

Откуда: Новосибирск
Сообщений: 90
Arioch
Результат функции проверять не нужно, там будет C++ exception брошен обязательно ?

там void в сигнатуре - так что только исключение.
26 сен 17, 13:31    [20823680]     Ответить | Цитировать Сообщить модератору
 Re: OO API FB3 Освобождение объекта транзакции после rollback  [new]
hvlad
Member

Откуда:
Сообщений: 9318
Arioch
Tonal
tra->commit(&status);



hvlad
release нужен если .... commit\rollback завершился с ошибкой


Результат функции проверять не нужно, там будет C++ exception брошен обязательно ?
Зависит от реального типа status.
По-умолчанию там Firebird::CheckStatusWrapper, который не бросает исключение, т.е. нужно проверять сам status:
if (status->getState() & Firebird::IStatus::STATE_ERRORS)
26 сен 17, 13:37    [20823710]     Ответить | Цитировать Сообщить модератору
 Re: OO API FB3 Освобождение объекта транзакции после rollback  [new]
hvlad
Member

Откуда:
Сообщений: 9318
hvlad
По-умолчанию там Firebird::CheckStatusWrapper
Уточню - есть выбор между ThrowStatusWrapper и CheckStatusWrapper, первый сам проверяет статус и бросает исключение, второй этого не делает.
26 сен 17, 13:43    [20823737]     Ответить | Цитировать Сообщить модератору
 Re: OO API FB3 Освобождение объекта транзакции после rollback  [new]
Tonal
Member

Откуда: Новосибирск
Сообщений: 90
hvlad,

В примерах используется как раз ThrowStatusWrapper.
Так что будем знать про возможность выбора. :)
26 сен 17, 13:57    [20823809]     Ответить | Цитировать Сообщить модератору
Все форумы / Firebird, InterBase Ответить