Data Base_Oracle/SQL

SQL_ROLLBACK & SAVEPOINT

pathas 2020. 1. 9. 22:44

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작업을 하면서 중간중간 세이브포인트를 만들어 두는 것은 만일의 사태에 대한 안전장치를 두는 것이라고 할 수 있겠습니다.