Безопасность переменных пакета Oracle - PullRequest
1 голос
/ 15 марта 2012

Если у меня есть переменная пакета в Oracle (8), и она изменена (увеличена) в функции, вызываемой из нескольких триггеров, возможно ли, чтобы функция вызывалась несколько раз одновременно?

В частности, у нас есть порядковые номера в бизнес-транзакции, поэтому у нас есть функция, которая возвращает следующий номер в последовательности для определенного сеанса, а затем функция, которая создает переменную пакета, представляющую порядковый номер.По сути, функция выглядит примерно так:

function get_seq_num return number is
  ret number;
begin
  if g_seq_num is not null then
    ret := g_seq_num;
    g_seq_num := g_seq_num + 1;
  else
    g_seq_num := 1;
  end if;
  return ret;
end get_seq_num;

Похоже, что 2 триггера пытаются зарегистрировать один и тот же seq_num для данной транзакции, и я не могу понять, почему (если они не запускаются одновременно, что ядумал, что они не будут).

** ПРИМЕЧАНИЕ 1. Для протокола, это устаревший код, который я унаследовал, и, вероятно, не в состоянии изменить его, независимо от того, насколько плохая практика это ....

** ПРИМЕЧАНИЕ 2. Поскольку я не думаю, что функция может выполняться несколько раз одновременно, я смотрю, можно ли обновить record_seq_num где-либо еще ....

1 Ответ

2 голосов
/ 15 марта 2012

Я думаю, что ответ на ваш вопрос вроде да.

Каждый сеанс базы данных получает свою собственную копию переменных пакета. Они не распределяются между сессиями. То, что вы описали, НЕ является безопасным способом создания последовательности. Если у вас есть один сеанс, который выполняет эту функцию несколько раз, его копия переменной пакета будет увеличена, а другой сеанс - нет. Таким образом, возможно, что сессия A вернет 1, 2, 3 ... и затем сессия B вернет 1.

Кроме того, ваша переменная пакета будет отброшена после закрытия сеанса или перекомпиляции пакета.

Вот вопрос Ask Tom на тему " Глобальная переменная в разных сеансах "

Вы должны использовать последовательность Oracle .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...