Где можно начинать транзакцию?

Поиск
Список
Период
Сортировка
От Anton
Тема Где можно начинать транзакцию?
Дата
Msg-id 8cac8dd0705281137k5c867809qa191ea9bbbbb2721@mail.gmail.com
обсуждение исходный текст
Ответы Re: Где можно начинать транзакцию?
Список pgsql-ru-general
Hi.

Подскажите пожалуйста популярно, где (в каких местах выполнения) можно
начать и закоммитить транзакцию?
Синтаксис функций подозрительно напоминает транзакцию - те же
BEGIN/END. Так вот, не является ли функция сама по себе транзакцией
(если я её вызываю НЕ из транзакции, а просто из psql)? То есть, если
работа прерывается во время выполнения функции, то что будет? Полный
откат всего что она наделала?

Далее. Несколько более ближе к делу. Есть функция - назовём её F() -
которая делает выборку из таблицы Т1, и для каждой полученной строки
выполняет некую вставку неких данных в другую таблицу Т2. На таблице
Т2 стоит триггер ON INSERT вызывает функцию Х() для каждой вставляемой
строки.

То есть:
SELECT func_A();
- которая делает что-то вроде
  FOR SELECT * FROM t1 LOOP
   INSERT INTO t2 ...;
  END LOOP;
- при этом
  ON INSERT INTO t2 FOR EACH ROW EXECUTE X();

Могу ли я выполнить транзакцию (транзакции) внутри функции Х() или
внутри А(); либо это только BEGIN-COMMIT "вокруг" самой внешней, то
есть вокруг вызова А()?

По причине того, что работа для каждой вставляемой строки
предполагается нагруженная, то хотелось бы делать транзакцию на,
скажем так, "обработку каждой строки". Чтобы можно было прервать А(),
и при этом осталась "работа" вплоть до последней полностью
обработанной строки. Но, с другой стороны, обработка каждой строки
должна быть "атомарной", то есть либо выполнится всё что в Х(), либо
полный откат того что она делала. Точнее, то что сделал триггер ON
INSERT должно быть как транзакция - всё или ничего.

Получается вопрос, можно ли сделать как-то типа
    FOR SELECT FROM t1 LOOP
begin;
     INSERT INTO t2;
commit;
    END LOOP;
внутри функции А()? Судя по синтаксису функций нельзя. Но "очень хочется"!
--
engineer

В списке pgsql-ru-general по дате отправления:

Предыдущее
От: "Ivan Zolotukhin"
Дата:
Сообщение: Re: Где хранятся привилегии
Следующее
От: Anton
Дата:
Сообщение: Re: Где можно начинать транзакцию?