Где можно начинать транзакцию? - Mailing list pgsql-ru-general

From Anton
Subject Где можно начинать транзакцию?
Date
Msg-id 8cac8dd0705281137k5c867809qa191ea9bbbbb2721@mail.gmail.com
Whole thread Raw
Responses Re: Где можно начинать транзакцию?
List 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 by date:

Previous
From: "Ivan Zolotukhin"
Date:
Subject: Re: Где хранятся привилегии
Next
From: Anton
Date:
Subject: Re: Где можно начинать транзакцию?