SAVEPOINT

SAVEPOINT (SAVEPOINT)

현재 트랜잭션 안에 새로운 세이브포인트(savepoint)를 정의하는 명령이에요. 세이브포인트는 트랜잭션 안의 특별한 표시로, 이후에 실행된 모든 명령을 롤백할 수 있게 해 트랜잭션 상태를 세이브포인트 시점으로 되돌려 줍니다.

출처: PostgreSQL 문서

본문

개요 (Synopsis)

SAVEPOINT savepoint_name

설명 (Description)

SAVEPOINT는 현재 트랜잭션 안에 새로운 세이브포인트를 설정해요.

세이브포인트는 트랜잭션 안의 특별한 표시로, 세이브포인트 설정 이후에 실행된 모든 명령을 롤백하고 트랜잭션 상태를 세이브포인트가 있던 시점으로 복원할 수 있게 해 줍니다.

파라미터 (Parameters)

  • savepoint_name — 새 세이브포인트에 줄 이름이에요. 같은 이름의 세이브포인트가 이미 있다면, 더 새롭고 같은 이름의 세이브포인트가 해제되기 전까지는 접근할 수 없어요.

참고 (Notes)

세이브포인트로 롤백하려면 ROLLBACK TO를, 세이브포인트를 파괴하되 이후 명령들의 효과는 유지하려면 RELEASE SAVEPOINT를 사용해요.

세이브포인트는 트랜잭션 블록 안에 있을 때만 설정할 수 있어요. 트랜잭션 안에는 여러 세이브포인트를 정의할 수 있습니다.

예시 (Examples)

세이브포인트를 설정하고, 이후에 그 이후 실행된 모든 명령의 효과를 되돌리려면:

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는 삽입하지 않아요.

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

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 my_savepoint;
    INSERT INTO table1 VALUES (2);
    SAVEPOINT my_savepoint;
    INSERT INTO table1 VALUES (3);

    -- rollback to the second savepoint
    ROLLBACK TO SAVEPOINT my_savepoint;
    SELECT * FROM table1;               -- shows rows 1 and 2

    -- release the second savepoint
    RELEASE SAVEPOINT my_savepoint;

    -- rollback to the first savepoint
    ROLLBACK TO SAVEPOINT my_savepoint;
    SELECT * FROM table1;               -- shows only row 1
COMMIT;

위 트랜잭션은 행 3이 먼저 롤백되고, 그다음 행 2가 롤백되는 모습을 보여줘요.

호환성 (Compatibility)

SQL은 같은 이름의 다른 세이브포인트가 설정되면 세이브포인트가 자동으로 파괴되도록 요구해요. PostgreSQL에서는 기존 세이브포인트를 유지하되, 롤백이나 해제할 때는 더 최근 것만 사용해요. (RELEASE SAVEPOINT로 더 최근 세이브포인트를 해제하면, 이전 세이브포인트가 ROLLBACK TO SAVEPOINTRELEASE SAVEPOINT에 다시 접근 가능해져요.) 그 외에는 SAVEPOINT가 SQL 표준을 완전히 준수해요.

더 알아보기 (Learn more)