Подтвердить что ты не робот

Вложенные транзакции в postgresql 8.2?

Я работаю над скриптами, которые применяют обновления схемы базы данных. Я настроил все мои сценарии обновления SQL, используя start transaction/commit. Я передаю эти сценарии в psql в командной строке.

Теперь мне нужно применить несколько сценариев одновременно и в одной транзакции. Пока единственное решение, которое я придумал, - удалить начальную транзакцию/фиксацию из исходного набора сценариев, а затем объединить их в новый блок транзакции/фиксации начала. Я пишу perl-скрипты, чтобы сделать это на лету.

Фактически я хочу вложенные транзакции, которые я не могу понять, как это сделать в postgresql.

Есть ли способ сделать или имитировать вложенные транзакции для этой цели? У меня есть настройки, которые автоматически срабатывают при любой ошибке, поэтому мне не нужно продолжать транзакцию верхнего уровня, если какой-либо из нижних не работает.

4b9b3361

Ответ 1

У вас есть возможность использовать вложенные транзакции внутри postgresql с помощью SavePoints.

Возьмите этот пример кода:

CREATE TABLE t1 (a integer PRIMARY KEY);

CREATE FUNCTION test_exception() RETURNS boolean LANGUAGE plpgsql AS
$$BEGIN
   INSERT INTO t1 (a) VALUES (1);
   INSERT INTO t1 (a) VALUES (2);
   INSERT INTO t1 (a) VALUES (1);
   INSERT INTO t1 (a) VALUES (3);
   RETURN TRUE;
EXCEPTION
   WHEN integrity_constraint_violation THEN
      RAISE NOTICE 'Rollback to savepoint';
      RETURN FALSE;
END;$$;

BEGIN;

SELECT test_exception();
NOTICE:  Rollback to savepoint
 test_exception 
----------------
 f
(1 row)

COMMIT;

SELECT count(*) FROM t1;
 count 
-------
     0
(1 row)

Возможно, это поможет вам немного.

Ответ 2

Я закончил "решение" моей проблемы вне диапазона - я использую perl script для повторной работы входных скриптов, чтобы устранить их начальные транзакции/фиксации вызовов, а затем направить их все в один файл, который получает он сам начинает транзакцию/фиксацию.