본문 바로가기

Oracle Data Base

[SQL Plus]Transaction - COMMIT,ROLLBACK,SAVEPOINT

트랜잭션(Transaction) : 데이터베이스에서 데이터를 처리하는 하나의 논리적인 작업 단위

 

COMMIT: 모든 작업들을 정상적으로 처리, 변경된 내용을 모두 영구 저장

ROLLBACK: 처리과정에서 발생한 변경 사항을 취소 이전의 상태로 되돌리기

 

자동 COMMIT : DDL(CREATE,ALTER,DROP),DCL(GRANT,REVOKE)은 자동으로 COMMIT됨

                     DML(INSERT,UPDATE,DELETE)은 COMMIT명령어 사용전까지는 복구(ROLLBACK) 가능

 

1. COMMIT

SQL Plus창 두개를 띄워놓고 실행

[첫번째 창]

SQL> create table b_dept2 as select * from dept;

SQL> insert into b_dept2 values(50,'SUPPORT','GWANGJU');
SQL> select * from b_dept2;
    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON
        50 SUPPORT        GWANGJU

[두번째 창]

SQL> select * from b_dept2;
    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON

=> 50번 부서 반영 안됨

[첫번째 창]

SQL> COMMIT;

[두번째 창]

SQL> select * from b_dept2; 
    DEPTNO DNAME          LOC 
---------- -------------- ------------- 
        10 ACCOUNTING     NEW YORK 
        20 RESEARCH       DALLAS 
        30 SALES          CHICAGO 
        40 OPERATIONS     BOSTON 
        50 SUPPORT        GWANGJU

=> 50번 부서 반영됨

 

2. ROLLBACK

SQL> update b_dept2 set dname='TEST',loc='SUWON'
       where deptno=50;

SQL> select * from b_dept2;

    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON
        50 TEST           SUWON

=> 50번 부서 변경, 메모리에 반영 되기 전 상태

 

SQL> rollback;
롤백이 완료되었습니다.

SQL> select * from b_dept2;

    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON
        50 SUPPORT        GWANGJU

=> 50번 부서 원래대로 되돌림

3. SAVEPOINT

SQL> insert into b_dept2 values(60,'TESTING','SEOUL');

SQL> savepoint A;     <-- SAVEPOINT

SQL>update b_dept2 set dname='IMSI',loc='BUSAN'
      where deptno=50;

SQL>savepoint B;      <-- SAVEPOINT

SQL>delete from b_dept2 where deptno=40;

SQL> select * from b_dept2;

    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        50 IMSI           BUSAN 
        60 TESTING        SEOUL

=>60번 추가, 50번 변경, 40번 삭제 상태

 

SQL>rollback to B;
롤백이 완료되었습니다.
SQL> select * from b_dept2;

    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON  
        50 IMSI           BUSAN
        60 TESTING        SEOUL

=> 40번 삭제 상태를 복구

 

sql>rollback to A;
롤백이 완료되었습니다.
SQL> select * from b_dept2;

    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON
        50 SUPPORT        GWANGJU 
        60 TESTING        SEOUL

=> 50번 변경 전으로 복구

 

sql> rollback;
롤백이 완료되었습니다.
SQL> select * from b_dept2;

    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON
        50 SUPPORT        GWANGJU

=>60번 입력 전으로 복구