RELEASE SAVEPOINT

RELEASE SAVEPOINT (RELEASE SAVEPOINT)

이전에 정의해 둔 세이브포인트(savepoint)를 해제(release)하는 명령이에요. 세이브포인트에서 했던 변경을 버리고 싶은 게 아니라, 세이브포인트를 지우면서 그 이후의 변경을 트랜잭션에 그대로 남기고 싶을 때 씁니다.

출처: PostgreSQL 문서

본문

개요 (Synopsis)

RELEASE [ SAVEPOINT ] savepoint_name

설명 (Description)

RELEASE SAVEPOINT는 지정된 세이브포인트와, 그 세이브포인트 이후에 만들어진 모든 활성 세이브포인트를 해제하고 그 리소스를 비워요. 세이브포인트 생성 이후에 이뤄졌고 아직 롤백되지 않은 모든 변경은, 지정된 세이브포인트가 생성될 당시 활성이던 트랜잭션이나 세이브포인트로 병합됩니다. RELEASE SAVEPOINT 이후에 만들어진 변경도 이 활성 트랜잭션이나 세이브포인트의 일부가 돼요.

파라미터 (Parameters)

  • savepoint_name — 해제할 세이브포인트의 이름이에요.

참고 (Notes)

이전에 정의되지 않은 세이브포인트 이름을 지정하면 오류가 나요.

트랜잭션이 aborted(중단) 상태일 때는 세이브포인트를 해제할 수 없어요. 이 경우에는 ROLLBACK TO SAVEPOINT를 사용해요.

같은 이름의 세이브포인트가 여러 개 있으면, 가장 최근에 정의되고 아직 해제되지 않은 것만 해제돼요. 명령을 반복하면 점점 오래된 세이브포인트가 해제됩니다.

예시 (Examples)

세이브포인트를 설정하고 나중에 해제하려면:

BEGIN;
    INSERT INTO table1 VALUES (3);
    SAVEPOINT my_savepoint;
    INSERT INTO table1 VALUES (4);
    RELEASE SAVEPOINT my_savepoint;
COMMIT;

위 트랜잭션은 3과 4를 모두 삽입해요.

여러 중첩 서브트랜잭션이 있는 더 복잡한 예시:

BEGIN;
    INSERT INTO table1 VALUES (1);
    SAVEPOINT sp1;
    INSERT INTO table1 VALUES (2);
    SAVEPOINT sp2;
    INSERT INTO table1 VALUES (3);
    RELEASE SAVEPOINT sp2;
    INSERT INTO table1 VALUES (4))); -- generates an error

이 예시에서 애플리케이션은 3을 삽입한 세이브포인트 sp2의 해제를 요청해요. 이는 삽입의 트랜잭션 컨텍스트를 sp1로 바꿉니다. 값 4를 삽입하려는 문장이 오류를 일으키면, 값 2와 4는 같은 (지금 롤백된) 세이브포인트에 있어 손실되고, 값 3은 같은 트랜잭션 컨텍스트에 있습니다. 애플리케이션은 이제 다음 두 명령 중 하나만 선택할 수 있어요. 다른 명령은 모두 무시되기 때문이에요:

ROLLBACK;
ROLLBACK TO SAVEPOINT sp1;

ROLLBACK을 선택하면 값 1을 포함한 모든 것이 중단되지만, ROLLBACK TO SAVEPOINT sp1을 선택하면 값 1을 유지하고 트랜잭션을 계속 진행할 수 있어요.

호환성 (Compatibility)

이 명령은 SQL 표준을 준수해요. 표준은 SAVEPOINT 키워드가 필수라고 규정하지만, PostgreSQL은 이를 생략할 수 있게 허용해요.

더 알아보기 (Learn more)