Вложенные транзакции в postgresql 8.2?
-
03-07-2019 - |
Вопрос
Я работаю над сценариями, которые применяют обновления схемы базы данных.Я настроил все свои сценарии обновления SQL, используя стартовую транзакцию/фиксацию.Я передаю эти сценарии в psql в командной строке.
Теперь мне нужно применить несколько сценариев одновременно и в одной транзакции.Пока что единственное решение, которое я придумал, — это удалить стартовую транзакцию/фиксацию из исходного набора скриптов, а затем объединить их внутри нового блока стартовой транзакции/фиксации.Я пишу сценарии на Perl, чтобы делать это на лету.
По сути, мне нужны вложенные транзакции, которые я не могу понять, как это сделать в postgresql.
Есть ли способ выполнить или смоделировать вложенные транзакции для этой цели?У меня есть настройки для автоматического устранения любой ошибки, поэтому мне не нужно продолжать транзакцию верхнего уровня, если какая-либо из транзакций нижнего уровня завершится неудачей.
Решение
Что ж, у вас есть возможность использовать вложенные транзакции внутри 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)
Возможно, это вам немного поможет.
Другие советы
В итоге я «решил» свою проблему вне диапазона - я использую Perl-скрипт, чтобы переработать входные сценарии, чтобы исключить их вызовы запуска транзакции/фиксации, а затем помещаю их все в один файл, который получает свою собственную стартовую транзакцию/ совершить.