Watch at Ease세상을 읽고, 일상의 답을 찾다.

기술 · 실용 가이드

PostgreSQL에서 ‘현재 트랜잭션이 중단됨’이 보이나요? 재시도 전에 첫 오류부터 찾으세요

SQLSTATE 25P02를 앞선 실패의 결과로 보고, 첫 SQLSTATE와 연결·트랜잭션 소유자를 보존한 뒤 전체 롤백 또는 실패 전에 만든 세이브포인트를 선택합니다.

첫 데이터베이스 작업 실패 뒤 후속 작업이 차단되는 오리지널 일러스트.
오리지널 일러스트: 뒤의 25P02는 결과입니다. 복구 전에 첫 실패를 보존하세요. Watch at Ease

PostgreSQL의 ‘current transaction is aborted’ 메시지는 대개 같은 트랜잭션에서 더 먼저 실패한 문장의 결과입니다. 마지막 명령을 반복해도 복구되지 않고 최초 원인을 가릴 수 있습니다.

안전한 순서는 첫 오류를 보존하고 정확한 연결과 트랜잭션 소유자에 매핑한 뒤 유효한 복구 분기를 선택하고, 재시도나 풀 반환 전에 연결 상태를 검증하는 것입니다.

복구 전에 첫 실패를 동결하세요

25P02는 같은 트랜잭션의 이전 문장이 실패해 복구 전까지 후속 명령이 무시된다는 뜻입니다. 첫 서버 오류, SQLSTATE, 안전한 문장 지문, 매개변수 유형, 시간과 스택을 롤백 전에 보존하세요.

처음 보이는 줄이 이미 25P02라면 같은 연결의 더 이른 로그, 클라이언트 생성 문장, 트리거, 제약 오류와 예외를 확인하세요.

정확한 연결과 트랜잭션 경계를 입증하세요

애플리케이션 인스턴스, 풀, 연결 ID, DB 사용자, 백엔드 PID, autocommit, 시작 시각을 기록하세요. 한 요청이 여러 연결을 쓰고 한 연결이 여러 요청을 처리할 수 있습니다.

BEGIN, ORM 작업 단위, 마이그레이션, 노트북, DB 클라이언트 또는 드라이버의 암시적 트랜잭션 중 누가 소유자인지 확인하세요. Psycopg는 autocommit이 아니면 SELECT도 기본적으로 트랜잭션을 시작합니다.

안전한 세이브포인트가 없으면 전체 롤백

작업을 버릴 수 있다면 드라이버나 프레임워크 rollback을 호출하고 실패 상태가 끝났는지 확인한 뒤 재시도하세요. 정리하지 않은 연결을 풀로 돌려보내면 다음 요청에 증상이 전달됩니다.

전체 롤백은 모든 미커밋 변경을 취소합니다. 잃을 작업과 트랜잭션 소유자를 기록하고 COMMIT으로 오류를 숨기려 하지 마세요.

세이브포인트는 위험 작업보다 먼저 있어야 합니다

실패 전에 만든 세이브포인트만 앞선 작업을 보존할 수 있습니다. ROLLBACK TO SAVEPOINT로 복구한 뒤 계속하거나 해제하세요. 25P02 이후 새로 만드는 것은 늦습니다.

중단 상태에서는 RELEASE SAVEPOINT가 허용되지 않습니다. 프레임워크가 만든 세이브포인트라면 해당 API를 사용해 클라이언트와 서버 상태를 맞추세요.

풀·ORM·DB 클라이언트의 숨은 문장을 감사하세요

헬스 체크, 행 수 쿼리, 메타데이터 조회, 콜백, 자동 flush가 화면의 SQL보다 먼저 실행됐는지 확인하세요. DBeaver 이슈는 이 문제군의 수요 증거일 뿐, 같은 결함이 있다고 단정하는 근거가 아닙니다.

풀 반환 전에 명시적으로 commit 또는 rollback하고 유휴 상태를 확인하세요. ORM에서는 상위 예외로 감싸기 전 첫 DB 예외를 보존하세요.

마지막 문장이 아니라 작업 단위를 재시도

첫 원인을 고친 뒤 정의된 경계에서 최소의 멱등 업무 단위를 재시도하세요. 마지막 INSERT나 SELECT만 반복하면 DB 밖의 부작용이 중복될 수 있습니다.

첫 SQLSTATE로 재시도 가능성을 분류하세요. 제약 오류는 입력 수정, 일시적 동시성 오류는 제한적 재시도, 권한 오류는 설정 수정이 필요합니다.

서비스 반환 전에 깨끗한 연결을 검증

같은 프레임워크 경로로 무해한 상태 점검을 실행하고 다음 트랜잭션이 정상 시작·종료되는지 풀 리셋 로그나 연결 상태로 확인하세요.

첫 SQLSTATE, 소유자, 연결 ID, 복구 분기, 손실 작업, 재시도 결정과 예방 변경을 기록하고 종료하세요.

전체 롤백과 이전 세이브포인트 복구를 비교하는 오리지널 일러스트.
오리지널 일러스트: 위험 작업 전 세이브포인트가 있고 소유자가 기대한 경우에만 사용하세요. Watch at Ease