2008-10-15 4 views
11

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

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

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

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

ответ

5

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

Чтобы использовать точки сохранения в этом случае, мне придется изменить существующие сценарии и их запуск. В этом конкретном случае, если бы это было сделано, я бы просто удалил блок транзакции start/end из всех моих скриптов и добавлю его отдельно, что упростит выполнение нескольких действий сразу. Спасибо! – 2008-10-16 14:28:03

0

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

Смежные вопросы