Вложенные транзакции в postgresql 8.2?
Я работаю над скриптами, которые применяют обновления схемы базы данных. Я настроил все мои сценарии обновления SQL, используя start transaction/commit. Я передаю эти сценарии в psql в командной строке.
Теперь мне нужно применить несколько сценариев одновременно и в одной транзакции. Пока единственное решение, которое я придумал, - удалить начальную транзакцию/фиксацию из исходного набора сценариев, а затем объединить их в новый блок транзакции/фиксации начала. Я пишу perl-скрипты, чтобы сделать это на лету.
Фактически я хочу вложенные транзакции, которые я не могу понять, как это сделать в postgresql.
Есть ли способ сделать или имитировать вложенные транзакции для этой цели? У меня есть настройки, которые автоматически срабатывают при любой ошибке, поэтому мне не нужно продолжать транзакцию верхнего уровня, если какой-либо из нижних не работает.
Ответы
Ответ 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 для повторной работы входных скриптов, чтобы устранить их начальные транзакции/фиксации вызовов, а затем направить их все в один файл, который получает он сам начинает транзакцию/фиксацию.