You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL中EXCEPTION块结束后是否自动释放子事务?

PostgreSQL中PLPGSQL EXCEPTION块的子事务释放时机

结论:EXCEPTION块对应的子事务会在块执行完毕(无论正常结束还是触发异常处理)后立即自动释放,不会等到主事务结束。

具体逻辑如下:

  • 当PLPGSQL中定义带EXCEPTION的BEGIN...END块时,PostgreSQL会自动为该块创建一个独立子事务。
  • 如果块正常执行完成(未触发任何异常),这个子事务会被提交,其内部的修改会合并到主事务中,子事务随即被释放。
  • 如果块内触发异常并进入EXCEPTION分支,PostgreSQL会先回滚该子事务内的所有修改,再执行异常处理逻辑;处理完成后,子事务同样会被释放,主事务可以继续执行后续代码。

结合你给出的存储过程示例:

CREATE PROCEDURE example_proc()
LANGUAGE PLPGSQL
AS $$
BEGIN
    -- Start a subtransaction
    BEGIN
        -- Do some operations...
    EXCEPTION
        WHEN OTHERS THEN
            RAISE NOTICE 'Caught error';
    END;
    
    -- Do some operations...
    COMMIT;
END;
$$;

第一个带EXCEPTION的BEGIN...END块执行结束后,不管有没有触发RAISE NOTICE,对应的子事务已经被释放。后续的操作都是在主事务的上下文里执行,最终由COMMIT提交整个主事务。

额外补充:

  • 子事务的生命周期完全绑定到所属的BEGIN...EXCEPTION...END块,块结束则子事务立即结束,不会留存到主事务的后续阶段。
  • 这种设计既能保证异常块内的修改要么完整提交、要么完全回滚,不影响块外逻辑,也能避免子事务长时间占用数据库资源。

内容的提问来源于stack exchange,提问作者Tri Pham

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 00:42:03