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은 이를 생략할 수 있게 허용해요.