거래 내 거래


18

예를 들어 아래 스크립트가 호출 된 경우 PostgreSQL이 표시하는 동작

BEGIN;
SELECT * FROM foo;
INSERT INTO foo(name) VALUES ('bar');
BEGIN; <- The point of interest
END;

PostgreSQL이 두 번째를 버릴 BEGIN것인지 아니면 커밋이 암묵적으로 결정된 다음 BEGIN END마지막에 블록을 별도의 트랜잭션으로 실행합니까?

답변:


13

당신이 필요로하는 것은 소위 "자율 거래"(오라클이 제공하는 기능)입니다. 현재로서는 PostgreSQL에서는 아직 불가능합니다. 그러나 SAVEPOINT 를 사용할 수 있습니다 .

BEGIN;
INSERT ...
SAVEPOINT a;
some error;
ROLLBACK TO SAVEPOINT a;
COMMIT;

완전히 자율적 인 거래는 아니지만 "모든 거래"를 올바르게 처리 할 수 ​​있습니다. 이를 사용하여 자율 거래에서 기대하는 것을 달성 할 수 있습니다.

그렇지 않으면이 시점에서 다른 합리적인 해결책이 없습니다.


13

당신은 그것을 직접 시도 할 수 있습니다 :

경고 : 이미 진행중인 거래가 있습니다

중첩 된 트랜잭션이 PostgreSQL에서 구현되지 않으므로 새로운 하위 트랜잭션이 시작되지 않습니다. (당신은 어떤 마법을 할 수 있습니다pl/pgsql 예를 들어, 동작을 흉내내는 기능 .)

PostgreSQL 11을 사용하면 새로운 실제 저장 프로 시저와 트랜잭션 처리 기능이 중첩 트랜잭션을 가능하게 할 수 있다고 생각할 수 있습니다. 그러나 documentation 에 따르면 이는 사실이 아닙니다.

CALL명령과 익명 코드 블록 ( DO명령) 에서 호출 된 프로 시저 에서 COMMIT및 명령을 사용하여 트랜잭션을 종료 할 수 있습니다 ROLLBACK. 이 명령을 사용하여 트랜잭션이 종료 된 후 새 트랜잭션이 자동으로 시작되므로 별도의 START TRANSACTION 명령이 없습니다.


9

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설명서를 참조하십시오.


0

Postgresql 9.5 이상에서는 pg_background 확장자로 제공되는 동적 백그라운드 워커를 사용할 수 있습니다. 자율적 인 거래를 만듭니다. 확장 프로그램 의 github 페이지 를 참조하십시오 . 해결책은 db_link보다 낫습니다. PostgreSQL의 자율 트랜잭션 지원에 대한 완전한 가이드가 있습니다

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.