답변:
당신이 필요로하는 것은 소위 "자율 거래"(오라클이 제공하는 기능)입니다. 현재로서는 PostgreSQL에서는 아직 불가능합니다. 그러나 SAVEPOINT 를 사용할 수 있습니다 .
BEGIN;
INSERT ...
SAVEPOINT a;
some error;
ROLLBACK TO SAVEPOINT a;
COMMIT;
완전히 자율적 인 거래는 아니지만 "모든 거래"를 올바르게 처리 할 수 있습니다. 이를 사용하여 자율 거래에서 기대하는 것을 달성 할 수 있습니다.
그렇지 않으면이 시점에서 다른 합리적인 해결책이 없습니다.
당신은 그것을 직접 시도 할 수 있습니다 :
경고 : 이미 진행중인 거래가 있습니다
중첩 된 트랜잭션이 PostgreSQL에서 구현되지 않으므로 새로운 하위 트랜잭션이 시작되지 않습니다. (당신은 어떤 마법을 할 수 있습니다pl/pgsql
예를 들어, 동작을 흉내내는 기능 .)
PostgreSQL 11을 사용하면 새로운 실제 저장 프로 시저와 트랜잭션 처리 기능이 중첩 트랜잭션을 가능하게 할 수 있다고 생각할 수 있습니다. 그러나 documentation 에 따르면 이는 사실이 아닙니다.
CALL
명령과 익명 코드 블록 (DO
명령) 에서 호출 된 프로 시저 에서COMMIT
및 명령을 사용하여 트랜잭션을 종료 할 수 있습니다ROLLBACK
. 이 명령을 사용하여 트랜잭션이 종료 된 후 새 트랜잭션이 자동으로 시작되므로 별도의 START TRANSACTION 명령이 없습니다.
PostgreSQL은 하위 트랜잭션을 지원하지 않지만이 SAVEPOINT
기능은 사용자의 요구에 효과적으로 응답 할 수 있습니다. GitHub에서 Vitaly Tomilov의 약속 을 통해 고급 액세스 계층 문서 에서 PG로 인용 :
PostgreSQL은 중첩 트랜잭션을 제대로 지원하지 않으며 저장 점을 통한 부분 롤백 만 지원합니다 내부의 합니다. 두 가지 기술의 차이는 추가 설명과 같이 엄청납니다.
중첩 된 트랜잭션에 대한 올바른 지원은 상위 트랜잭션이 롤백 될 때 성공적인 서브 트랜잭션 결과가 롤백되지 않음을 의미합니다. 그러나 PostgreSQL 저장 지점을 사용하면 최상위 트랜잭션을 롤백하면 모든 내부 저장 지점의 결과도 롤백됩니다.
저장 점은 활성 트랜잭션 내의 이전 지점으로 부분 롤백하는 데 사용할 수 있습니다. 예를 들어, 저장 점을 설정하고 나중에 설정 후 실행 된 모든 명령의 효과를 취소하려면 다음을 수행하십시오.
BEGIN;
INSERT INTO table1 VALUES (1);
SAVEPOINT my_savepoint;
INSERT INTO table1 VALUES (2);
ROLLBACK TO SAVEPOINT my_savepoint;
INSERT INTO table1 VALUES (3);
COMMIT;
위의 트랜잭션은 값 1과 3을 삽입하지만 2는 삽입하지 않습니다. 자세한 내용은 SAVEPOINT
설명서를 참조하십시오.
Postgresql 9.5 이상에서는 pg_background 확장자로 제공되는 동적 백그라운드 워커를 사용할 수 있습니다. 자율적 인 거래를 만듭니다. 확장 프로그램 의 github 페이지 를 참조하십시오 . 해결책은 db_link보다 낫습니다. PostgreSQL의 자율 트랜잭션 지원에 대한 완전한 가이드가 있습니다