ROLLBACK TO SAVEPOINT

ROLLBACK TO SAVEPOINT (ROLLBACK TO SAVEPOINT)

세이브포인트(savepoint) 지점까지 트랜잭션을 되돌리는 명령이에요. 세이브포인트를 설정한 뒤 실행된 명령들을 취소하고, 같은 트랜잭션 레벨에서 새로운 서브트랜잭션을 시작해요.

출처: PostgreSQL 문서

본문

개요 (Synopsis)

ROLLBACK [ WORK | TRANSACTION ] TO [ SAVEPOINT ] savepoint_name

설명 (Description)

세이브포인트가 설정된 이후에 실행된 모든 명령을 롤백하고, 그러고 나서 같은 트랜잭션 레벨에서 새 서브트랜잭션을 시작해요. 세이브포인트는 계속 유효하므로, 필요하다면 나중에 다시 그 지점으로 롤백할 수 있어요.

ROLLBACK TO SAVEPOINT는 지정된 세이브포인트 이후에 설정된 모든 세이브포인트를 암묵적으로 파괴해요.

파라미터 (Parameters)

  • savepoint_name — 롤백할 세이브포인트의 이름이에요.

참고 (Notes)

세이브포인트를 설정한 뒤 실행된 명령들의 효과를 버리지 않고 세이브포인트만 파괴하려면 RELEASE SAVEPOINT를 사용해요.

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

커서(cursor)는 세이브포인트와 관련해 다소 비트랜잭션적인 동작을 보여요. 세이브포인트 안에서 열린 커서는 세이브포인트가 롤백되면 닫힙니다. 나중에 롤백되는 세이브포인트 안에서 FETCHMOVE 명령의 영향을 받은 이전에 열린 커서는, FETCH가 가리키던 위치를 그대로 유지해요 (즉 FETCH에 의한 커서 이동은 롤백되지 않아요). 커서를 닫는 것도 롤백으로는 되돌려지지 않아요. 다만 커서의 쿼리가 일으키는 다른 부수 효과(예: 쿼리가 호출한 volatile 함수의 부수 효과)는, 나중에 롤백된 세이브포인트 동안 발생했다면 롤백됩니다. 실행 중 트랜잭션을 중단시키는 커서는 cannot-execute 상태가 되는데, 그래서 ROLLBACK TO SAVEPOINT로 트랜잭션을 복원할 수는 있지만 그 커서는 더 이상 사용할 수 없어요.

예시 (Examples)

my_savepoint가 설정된 이후에 실행된 명령들의 효과를 되돌리려면:

ROLLBACK TO SAVEPOINT my_savepoint;

커서 위치는 세이브포인트 롤백의 영향을 받지 않아요:

BEGIN;

DECLARE foo CURSOR FOR SELECT 1 UNION SELECT 2;

SAVEPOINT foo;

FETCH 1 FROM foo;
 ?column?
----------
        1

ROLLBACK TO SAVEPOINT foo;

FETCH 1 FROM foo;
 ?column?
----------
        2

COMMIT;

호환성 (Compatibility)

SQL 표준은 SAVEPOINT 키워드가 필수라고 규정하지만, PostgreSQL과 Oracle은 이를 생략할 수 있게 허용해요. SQL은 ROLLBACK 뒤의 잡음 단어(noise word)로 WORK만 허용하고 TRANSACTION은 허용하지 않아요. 또한 SQL에는 AND [ NO ] CHAIN이라는 선택적 절이 있지만, PostgreSQL은 현재 이를 지원하지 않아요. 그 외에는 이 명령이 SQL 표준을 준수해요.

더 알아보기 (Learn more)