SQL_ROLLBACK & SAVEPOINT
ROLLBACK
- 처리 과정에서 발생한 변경 사항 취소
- COMMIT을 하지 않은 상태라면 원상태로 복구
※ 자동 ROLLBACK 되는 경우
- 비정상적인 종료 ex) 정전, 컴퓨터 다운
SAVE POINT
TRANSACTION 사이에 복구 범위를 지정하는 기능
별칭을 부여해서 사용하며, 책갈피라고 생각하면 이해하기 쉬움
§ 형식
[ SQL> savepoint 별칭 ; ]
§ 사용 방법
※ 실행순서 DML1 → DML2 → DML3
| 최근 COMMIT 지점 |
|---|
| DML 1 |
| savepoint 별칭 A |
| DML 2 |
| savepoint 별칭 B |
| DML 3 |
| rollback 지점 |
[ SQL> rollback; ] : DML 1,2,3 전부 취소
[ SQL> rollback to 별칭 A; ] : DML 2,3 취소
[ SQL> rollback to 별칭 B; ] : DML 3 취소
# 예제
▷ dept테이블의 백업 테이블인 b_dept2 테이블 생성
[ SQL> create table b_dept2 as select * from dept; ]
| DEPTNO | DNAME | LOC |
|---|---|---|
| 10 | ACCOUNTING | NEW YORK |
| 20 | RESEARCH | DALLAS |
| 30 | SALES | CHICAGO |
| 40 | OPERATIONS | BOSTON |
{ INSERT }
▷부서번호 50, 부서이름 SUPPORT, 위치 KWANGJU인 데이터를 입력
[ SQL> insert into b_dept2 values(50, 'SUPPORT', 'KWANGJU');]
| DEPTNO | DNAME | LOC |
|---|---|---|
| 10 | ACCOUNTING | NEW YORK |
| 20 | RESEARCH | DALLAS |
| 30 | SALES | CHICAGO |
| 40 | OPERATIONS | BOSTON |
| 50 | SUPPORT | KWANGJU |
{ SAVEPOINT A }
▶ 저장점 A 생성
[ SQL> savepoint A;
저장점이 생성되었습니다. ]
{ UPDATE }
▷부서번호가 50인 레코드의 부서이름을 IMSI로, 위치를 BUSAN으로 변경
[ SQL> update b_dept2 set dname='IMSI', loc='BUSAN' where deptno=50; ]
| DEPTNO | DNAME | LOC |
|---|---|---|
| 10 | ACCOUNTING | NEW YORK |
| 20 | RESEARCH | DALLAS |
| 30 | SALES | CHICAGO |
| 40 | OPERATIONS | BOSTON |
| 50 | IMSI | BUSAN |
{ SAVEPOINT B }
▶ 저장점 B 생성
[ SQL> savepoint B;
저장점이 생성되었습니다. ]
{ DELETE }
▷ 부서번호가 40인 레코드를 삭제
[ SQL> delete from b_dept2 where deptno=40; ]
| DEPTNO | DNAME | LOC |
|---|---|---|
| 10 | ACCOUNTING | NEW YORK |
| 20 | RESEARCH | DALLAS |
| 30 | SALES | CHICAGO |
| 50 | IMSI | BUSAN |
{ ROLLBACK TO B }
▶▶ 저장점 B까지 롤백
[ SQL> rollback to B; ]
| DEPTNO | DNAME | LOC |
|---|---|---|
| 10 | ACCOUNTING | NEW YORK |
| 20 | RESEARCH | DALLAS |
| 30 | SALES | CHICAGO |
| 40 | OPERATIONS | BOSTON |
| 50 | IMSI | BUSAN |
※ 부서번호 40인 레코드가 다시 생성됨 _ delete 취소
{ ROLLBACK TO A }
▶▶ 저장점 A까지 롤백
[ SQL> rollback to A; ]
| DEPTNO | DNAME | LOC |
|---|---|---|
| 10 | ACCOUNTING | NEW YORK |
| 20 | RESEARCH | DALLAS |
| 30 | SALES | CHICAGO |
| 40 | OPERATIONS | BOSTON |
| 50 | SUPPORT | KWANGJU |
※ 부서번호가 50인 레코드의 부서이름과 위치가 원상태로 복구됨 _ update 취소
{ ROLLBACK }
▶▶ 최근 COMMIT 지점까지 롤백
[ SQL> rollback ; ]
| DEPTNO | DNAME | LOC |
|---|---|---|
| 10 | ACCOUNTING | NEW YORK |
| 20 | RESEARCH | DALLAS |
| 30 | SALES | CHICAGO |
| 40 | OPERATIONS | BOSTON |
※ 50번 데이터가 입력되지 않은 상태로 복구 _ insert 취소
트랜잭션 사이에 세이브포인트를 지정하고 롤백을 사용하는 방법에 대해 알아보았습니다.
DML작업을 하면서 중간중간 세이브포인트를 만들어 두는 것은 만일의 사태에 대한 안전장치를 두는 것이라고 할 수 있겠습니다.