Создать хранимую процедуру в 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
не буду.