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으로 현재 트랜잭션을 닫는다.