반응형
SAVEPOINT, ROLLBACK TO
ROLLBACK을 사용하게 되면 데이터를 조작한 작업 전체가 되돌아가게 된다.
부분적으로만 돌아가면 되는데 트랜잭션 작업 단위에 속한 모든 작업이 되돌아가는 불상사가 발생한다.
이럴 때 사용할 수 있는 명령어가 SAVEPOINT와 ROLLBACK TO 명령어이다.
▷ 구문
SAVEPOINT [세이브 포인트 명]
ROLLBACK TO [저장된 세이브 포인트 명]
게임 같은 거를 할 때 세이브포인트를 저장해 그 시점으로 되돌아간 경험이 한 번쯤은 있을 텐데,
마찬가지로 저장된 그 순간으로 되돌아가는 기능이라 생각하면 된다.
SAVEPOINT로 저장하고 ROLLBACK TO로 저장된 세이브포인트로 돌아가는 것이다.
예를 한번 들어보자.
INSERT INTO oracleStudy VALUES(3,'TEST1');
SAVEPOINT onePoint;
INSERT INTO oracleStudy VALUES(4,'TEST1');
SAVEPOINT twoPoint;
값을 각각 하나씩 집어넣고 그 사이사이에 세이브 포인트를 지정했다.
DELETE FROM oracleStudy WHERE ename='TEST1';
-- 아무것도 없음
SELECT * FROM oracleStudy WHERE ename='TEST1';
당연히 값을 지우고 나서 SELECT를 해주면 아무 값도 출력되지 않는다.
자 여기서 이제 첫 번째 세이브 포인트인 onePoint로 ROLLBACK TO를 해보면 어떻게 될까?
ROLLBACK TO onePoint;
SELECT * FROM oracleStudy WHERE ename='TEST1';
oracleNo | ename |
3 | TEST1 |
해당 세이브 포인트로 돌아가기 때문에 그 이후에 이루어진 작업들은 취소가 되는 것이다. (onePoint를 지정하고 나서 한번 더 INSERT를 했음에도 그 데이터를 들어가 있지 않다.)
이번에는 두 번째 세이브 포인트인 twoPoint로 ROLLBACK TO를 해보자.
ROLLBACK TO twoPoint;
SELECT * FROM oracleStudy WHERE ename='TEST1';
oracleNo | ename |
3 | TEST1 |
4 | TEST1 |
두 개의 값이 INSERT 된 시점으로 ROLLBACk TO 하게 됐을 경우 당연히 두 개의 값이 선택된다.
이런 식으로 상황에 맞게 사용해주면 정말 유용한 기능이라고 생각된다.
반응형
댓글