Создать хранимую процедуру в PostgreSQL, которая никогда не откатывается? - PullRequest
1 голос
/ 26 мая 2011

Из руководства PostgreSQL 9.0 :

Важно: чтобы не блокировать параллельные транзакции, которые получают числа из той же последовательности, операция nextval никогда не откатывается;то есть, после того как значение было получено, оно считается использованным, даже если транзакция, которая выполняла nextval, позже прерывается.Это означает, что прерванные транзакции могут оставить неиспользованные «дыры» в последовательности назначенных значений.Операции setval также никогда не откатываются.

Итак, как я могу создать функцию PL \ PgSQL с таким же поведением: «операция никогда не откатывается»?
При таком вызовевсе изменения функции НЕ будут отменены:

BEGIN;
SELECT composite_nextval(...);
ROLLBACK;

1 Ответ

1 голос
/ 26 мая 2011

Вы можете использовать точку сохранения после выбора composite_nextval.Затем просто вернитесь к этой точке сохранения и передайте остальное.

Примерно так:

BEGIN;
    SELECT composite_nextval(...);
    SAVEPOINT my_savepoint;
    INSERT INTO some_table(a) VALUES (2);
    ROLLBACK TO SAVEPOINT my_savepoint;
COMMIT;

Таким образом, select composite_nextval(...) будет зафиксирован, но insert into some_table не будет.

...