PostgreSQL单个会话中能否创建或运行多个事务?
PostgreSQL 单个会话是否支持创建/运行多个事务
不支持,单个PostgreSQL会话同一时间仅能存在一个活跃的独立事务。
你给出的测试SQL执行时会出现以下实际表现:
- 执行第一个
BEGIN transaction;成功开启事务1,后续的update语句执行正常,变更处于事务1的未提交状态 - 此时再执行第二个
BEGIN transaction;尝试开启事务2时,PostgreSQL会抛出NOTICE: there is already a transaction in progress提示,不会创建新的事务,后续的update table set b=2操作仍然归属到第一个未提交的事务中 - 执行第一个
COMMIT transaction;时,两个update的变更会被同时提交 - 执行第二个
COMMIT transaction;时会报错ERROR: there is no transaction in progress,因为当前会话已经没有活跃事务了
测试SQL代码示例:
BEGIN transaction; --tran1 update table set b=1; BEGIN transaction; --tran2,此处会收到已有事务在运行的提示,不会开启新事务 update table set b=2; COMMIT transaction; -- 直接提交事务1内的所有变更 COMMIT transaction; -- 报错,无活跃事务可提交
相关核心规则:
- 如果你需要同时运行多个独立事务,必须创建多个独立的数据库会话,每个会话单独管理自己的事务生命周期
- 单个会话内如果需要执行多组事务操作,必须等前一组事务明确提交(COMMIT)或回滚(ROLLBACK)结束后,再开启下一个新事务
- PostgreSQL没有原生嵌套事务支持,如果你需要类似嵌套事务的部分回滚能力,可以使用
SAVEPOINT语法实现单事务内的局部回滚
内容的提问来源于stack exchange,提问作者Arcil Tralleis
相关产品推荐
相关产品推荐

