25001: active_sql_transaction
PostgreSQL含义
在事务处于活动状态时,调用了只能在事务之外或事务开始时运行的命令。某些命令不能在事务块中运行。
原因
SET TRANSACTION ISOLATION LEVEL 等设置必须在块中的第一个查询之前发出('SET TRANSACTION ISOLATION LEVEL must be called before any query')。同样,某些命令在已打开的 BEGIN/事务中会被拒绝。通常源于应用禁用了 autocommit 并在不知不觉中启动了事务。
解决方法
在事务的最开始、任何查询运行之前发出事务级设置:BEGIN; SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; ... 检查客户端库是否会隐式打开事务(autocommit 设置)。对于不能在事务块中运行的命令,先用 COMMIT/ROLLBACK 结束当前事务。