Обработка исключений Firebird 2.5 в рамках автономной транзакции - PullRequest
3 голосов
/ 20 января 2020

У меня наблюдается падение производительности в одной из наших хранимых процедур Firebird, и я понятия не имею, почему. Я нашел следующий код в упомянутом SP:

declare v_dummy integer;
...
in autonomous transaction do
begin
  -- insert may fail, but that is not a problem because it means the record is already there
  insert into my_table(my_field) values (:input_param);
when ANY do
  v_dummy = 1;
end

Я вижу несколько десятков записей в таблице RDB$TRANSACTIONS со СОСТОЯНИЕМ 3, в таблице MON $ TRANSACTIONS нет соответствующих записей.

Вопрос заключается в том, что в случае сбоя вставки будет выполнен откат автономной транзакции или «когда ЛЮБЫЕ» предотвратят откат, и будет открытая транзакция? Могу ли я просто удалить обработку исключений, чтобы она автоматически откатывалась, не вызывая исключение и не блокируя остальную часть кода?

1 Ответ

1 голос
/ 20 января 2020

Использование when any do внутри блока автономной транзакции не откатит транзакцию, вместо этого он будет зафиксирован после завершения блока, поскольку исключение не выходит за пределы блока.

Однако, это, вероятно, желаемый результат: фиксация транзакций в Firebird (относительно) дешевле, чем откат. Фактически, если транзакция откатывается, когда ничего не было изменено, Firebird все равно преобразует откат в коммит.

Я не думаю, что это является причиной вашей проблемы с производительностью, но без воспроизводимого примера это Трудно рассуждать об этом.

Помимо этого, транзакции с состоянием 3 откатываются, и транзакции отменяются. MON$TRANSACTIONS показывает только активные транзакции, поэтому откат транзакций не будет отображаться в этой виртуальной таблице.

...