在PostgreSQL中创建一个永不回滚的存储过程?

时间:2011-05-26 04:00:59

标签: postgresql stored-procedures transactions rollback

来自PostgreSQL 9.0 manual

  

重要说明:避免阻止获取的并发事务   来自相同序列的数字,从不滚动nextval操作   背部;也就是说,一旦获取了一个值,就会被认为是使用过的,   即使稍后执行nextval的事务也会中止。这意味着   中止的事务可能会在序列中留下未使用的“漏洞”   分配值。 setval操作也永远不会回滚。

那么,如何创建一个具有相同行为的PL \ PgSQL函数:“操作永远不会回滚”?
在这样的调用中,无论函数更改什么都不会回滚:

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

1 个答案:

答案 0 :(得分: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将不会。