PostgreSQL中CALL语句事务控制相关规则段落含义问询
PostgreSQL CALL语句事务控制规则解析
你提到的官方规则原文如下:
如果
CALL在事务块中执行,被调用的存储过程无法执行事务控制语句;仅当CALL在其所属的独立事务中执行时,才允许使用事务控制语句。
术语前置说明
首先明确两个核心概念:
- 事务块:指用户手动通过
BEGIN语句显式开启、尚未执行COMMIT/ROLLBACK结束的事务上下文 - 事务控制语句:指
COMMIT、ROLLBACK、SAVEPOINT这类直接控制事务生命周期的SQL语句
规则具体含义
可以拆分两种调用场景理解:
场景1:
如果你先手动开启了事务,再在这个事务内部执行CALL在已开启的事务块内执行CALL调用存储过程,那么存储过程内部不能包含任何事务控制语句,执行时会直接抛出异常。
底层逻辑是:此时事务的控制权属于外层你手动开启的事务,存储过程无权干涉外层事务的提交、回滚状态。场景2:
如果你没有手动开启事务,直接在会话中执行CALL作为独立事务执行CALL语句,这个CALL本身会作为一个独立的事务上下文运行,此时存储过程内部可以正常使用事务控制语句,自行管理内部事务的提交、回滚操作。
示例验证
-- 1. 先创建测试表和带事务控制的存储过程 CREATE TABLE IF NOT EXISTS test_tab (id INT); CREATE OR REPLACE PROCEDURE test_tx_proc() LANGUAGE plpgsql AS $$ BEGIN INSERT INTO test_tab VALUES (100); COMMIT; -- 存储过程内部包含事务控制语句 END; $$;
-- 2. 事务块内调用(报错场景) BEGIN; CALL test_tx_proc(); -- 执行报错:cannot commit while a subtransaction is active ROLLBACK;
-- 3. 独立调用(正常运行场景) CALL test_tx_proc(); -- 执行成功,插入的100数据会被正常提交
内容的提问来源于stack exchange,提问作者Arcil Tralleis
相关产品推荐
相关产品推荐

