PostgreSQL函数内执行COMMIT报错‘invalid transaction termination’原因
错误原因分析
- 核心问题是PL/pgSQL函数中不允许直接使用
COMMIT/ROLLBACK语句- PostgreSQL的
FUNCTION是在调用它的事务上下文里执行的,函数本身无法主动发起事务提交或回滚操作——事务的边界由外部调用者控制,而非函数内部。你在CREATE FUNCTION定义的逻辑里写入commit;,直接违反了这个规则,因此触发"invalid transaction termination"错误。
- PostgreSQL的
修复方案
方案1:改用存储过程(支持事务控制)
如果确实需要分段提交批量插入的数据,可将FUNCTION改为PROCEDURE,PostgreSQL的存储过程允许内部使用事务控制语句:
create table test.persons ( id serial primary key, first_name varchar, last_name varchar ); create or replace procedure test.generate_persons() as $$ begin for x in 1..10 loop for y in 1..10 loop insert into test.persons (first_name, last_name) values ( 'max', 'meier' ); end loop; commit; end loop; end; $$ language plpgsql; -- 调用存储过程使用CALL语句 call test.generate_persons();
方案2:移除事务提交语句
如果不需要分段提交,直接删除函数内的commit;即可,让所有插入操作在调用SELECT test.generate_persons()的事务中统一完成:
create or replace function test.generate_persons() returns void as $$ begin for x in 1..10 loop for y in 1..10 loop insert into test.persons (first_name, last_name) values ( 'max', 'meier' ); end loop; -- 移除commit语句 end loop; end; $$ language plpgsql; select test.generate_persons();
内容的提问来源于stack exchange,提问作者Rudi
相关产品推荐
相关产品推荐

