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 SAVEPOINT와 RELEASE SAVEPOINT에 다시 접근 가능해져요.) 그 외에는 SAVEPOINT가 SQL 표준을 완전히 준수해요.