-
SQL_ROLLBACK & SAVEPOINTData Base_Oracle/SQL 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작업을 하면서 중간중간 세이브포인트를 만들어 두는 것은 만일의 사태에 대한 안전장치를 두는 것이라고 할 수 있겠습니다.
'Data Base_Oracle > SQL' 카테고리의 다른 글
SQL_SEQUENCE (0) 2020.01.09 SQL_INDEX (0) 2020.01.09 SQL_TRANSACTION 개요 & COMMIT (0) 2020.01.09 SQL_ROWNUM & TOP-N 방식 (0) 2020.01.09 SQL_VIEW OPTIONS [WITH READ ONLY] (0) 2020.01.09