ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • SQL_ROLLBACK & SAVEPOINT
    Data 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

    댓글

Designed by Tistory.