【问题标题】:Create a stored procedure in PostgreSQL that is never rolled back?在 PostgreSQL 中创建一个永不回滚的存储过程?
【发布时间】:2011-09-02 06:35:29
【问题描述】:

来自PostgreSQL 9.0 manual

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

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

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

【问题讨论】:

    标签: postgresql stored-procedures transactions 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 不会。

    【讨论】:

    • 我相信问题是如何制作一个副作用持续存在的函数即使发生回滚,但除非我误解,否则您的答案会转化为“确保不要一路回滚”。
    • 是的,这些被称为自治事务,pg 不直接支持。但是,您可以使用 dblink 在事务中建立与 db 的新连接,并以这种方式获得等价物。
    • 就像@ryanc 评论一样,我希望在“nextval”行为中“确保不要一直回滚”。事实上,我想创建一个函数来使相同的东西成为“nextval”函数,但专门用于复合/多列主键(PK)。例如,如果我在 PK 中有 2 个字段,其中一个是外键 (FK),另一个是类似“序列”的字段,但这个序列将使用 DEFAULT composite_nextval( ... ) 而不是 nextval,PK 将是 (1,1 ), (1,2), (1,3), (2,1), (2,2), (3,1), ... 代替 (1,1), (1,2), (1 ,3), (2,4), (2,5), (3,6)。
    猜你喜欢
    • 2021-12-08
    • 2017-06-19
    • 1970-01-01
    • 2018-06-07
    • 1970-01-01
    • 2021-12-31
    • 1970-01-01
    • 2022-01-26
    • 1970-01-01
    相关资源
    最近更新 更多