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

From: Anton <anton200(at)gmail(dot)com>
To: pgsql-ru-general(at)postgresql(dot)org
Subject: Где можно начинать транзакцию?
Date: 2007-05-28 18:37:47
Message-ID: 8cac8dd0705281137k5c867809qa191ea9bbbbb2721@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: 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

Responses

Browse pgsql-ru-general by date

  From Date Subject
Next Message Anton 2007-05-31 06:58:39 Re: Где можно начинать транзакцию?
Previous Message Ivan Zolotukhin 2007-05-26 14:07:51 Re: Где хранятся привилегии