Skip site navigation (1) Skip section navigation (2)

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

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 (view raw or flat)
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

pgsql-ru-general by date

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

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group