Создать хранимую процедуру в PostgreSQL, которая никогда не откатывается?

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

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

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

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

1 ответ

Вы можете использовать точку сохранения после выбора 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 не буду.

Другие вопросы по тегам