使用事务块时pg_cron执行失败,报BEGIN状态异常错误求助
pg_cron执行含BEGIN/COMMIT的事务报错:FATAL: EndTransactionBlock: unexpected state BEGIN
问题原因
pg_cron在执行定时任务时,会自动为任务开启一个事务上下文。此时手动在语句中添加BEGIN;和COMMIT;会与这个自动事务产生冲突,导致事务状态异常,触发该错误。
解决方法
直接移除显式事务关键字
删掉语句中的BEGIN;和COMMIT;,让pg_cron的自动事务管理整个操作:TRUNCATE app_top50;INSERT INTO xxx...;封装为PL/pgSQL函数(适合复杂事务逻辑)
如果需要自定义事务控制(比如异常回滚),把逻辑封装成函数,再让pg_cron调用函数:- 创建函数:
CREATE OR REPLACE FUNCTION refresh_app_top50() RETURNS void AS $$ BEGIN TRUNCATE app_top50; INSERT INTO xxx...; -- 可选:添加异常处理逻辑 EXCEPTION WHEN OTHERS THEN ROLLBACK; RAISE; END; $$ LANGUAGE plpgsql;- pg_cron任务调用:
SELECT refresh_app_top50();
内容的提问来源于stack exchange,提问作者dojogeorge
相关产品推荐
相关产品推荐

