使用psycopg2调用pg_partman存储过程报错invalid transaction termination
问题原因与解决方案
根因分析
该报错的核心原因是psycopg2默认关闭自动提交,所有SQL执行都会默认包裹在隐式启动的事务块中:
- 你使用的
run_maintenance_proc存储过程内部,每处理完一个分区集合都会执行COMMIT操作完成事务提交 - 存储过程内部的
COMMIT会直接终止外层的隐式事务,psycopg2检测到事务状态异常就会抛出InvalidTransactionTermination错误 - psql命令行默认开启自动提交,单条
CALL语句执行时不会包裹在事务块中,因此存储过程内部的提交操作可以正常运行
修复方法
调用存储过程前主动开启连接的自动提交属性即可,修正后的代码如下:
dbconn = psycopg2.connect(t_dsn) # 开启自动提交,避免隐式事务块冲突 dbconn.autocommit = True cursor = dbconn.cursor() cursor.execute('CALL partman.run_maintenance_proc()') # 该存储过程无返回结果,无需调用fetchone() cursor.close() dbconn.close()
另外你提到的cursor.callproc方法确实不能用于调用存储过程,psycopg2的callproc底层是用SELECT语句实现的,仅支持调用函数,调用存储过程必须直接执行CALL语句。
内容的提问来源于stack exchange,提问作者tomahim
相关产品推荐
相关产品推荐

