Вложенные транзакции в postgresql 8.2? - PullRequest
11 голосов
/ 15 октября 2008

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

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

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

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

Ответы [ 2 ]

5 голосов
/ 15 октября 2008

Ну, у вас есть возможность использовать вложенные транзакции внутри 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)

Может быть, это поможет вам немного.

0 голосов
/ 16 октября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...