SooBlending

[Oracle] 트랜잭션(Transaction) COMMIT/ROLLBACK 본문

Programming/DataBase

[Oracle] 트랜잭션(Transaction) COMMIT/ROLLBACK

블랜더 2017. 11. 7. 14:27

<트랜잭션> Transaction

 - 데이터 처리의 한 단위

 - 오라클에서 발생하는 여러개의 SQL 명령문(DML)들을 하나의 논리적인 

   작업단위로 처리하는데 이를 트랜잭션이라 함.

 - 하나의 트랜잭션은 All-or-Nothing방식으로 처리.

 - 목적 : 데이터의 일관성을 유지하면서  안정적으로 데이터를 복구시키기 위해서.

 - 트랜잭션 제어 명령어 : commit, rollback, savepoint  

 

 1. COMMIT

   - 저장되지 않은 모든 데이터를 데이터베이스에 저장하고 

       현재의 트랜잭션을 종료하라는 명령어.

   - 커밋하면 트랜잭션의 처리과정이 모두 반영되며 하나의 트랜잭션 과정이 끝남.

   - 트랜잭션이 발생하는 경우 새롭게 생성되거나 갱신된 데이터들이 

       물리적으로 영구히 저장됨.

   - DDL(create,drop,alter,rename,truncate)은 AutoCommit!!

   - 정상적인 종료시에도 commit작업을 수행

     예) exit종료         

     

 2. ROLLBACK [TO SAVEPOINT명]

   - 저장되지 않은 모든 데이터 변경사항(DML)을 취소하고 현재의 트랜잭션을 

       끝내라는 명령.

   - 트랜잭션으로 인한 하나의 묶음처리가 시작되기 이전의 상태로 되돌려지는 것.

   - 이전상태로 되돌아가 지금까지 수행했던 데이터베이스의 변경을 

       모두 무효화.

   - 비정상적인 종료시 rollback작업을 수행.

     예) 우측 상단 X버튼 클릭시




drop table dept3;

create table dept3

as select * from dept;

==================================================================


SQL> select * from dept3;


    DEPTNO DNAME                        LOC

---------- ---------------------------- --------------------------

        10 ACCOUNTING                   NEW YORK

        20 RESEARCH                     DALLAS

        30 SALES                        CHICAGO

        40 OPERATIONS                   BOSTON


문제) 20번 부서와 40번 부서를 삭제하시오.

  delete from dept3

  where deptno IN (20,40);


SQL> select * from dept3;


    DEPTNO DNAME                        LOC

---------- ---------------------------- --------------------------

        10 ACCOUNTING                   NEW YORK

        30 SALES                        CHICAGO

        

문제) 30번 부서의 이름을 '영업부'로 변경하시오.

  update dept3 

  set dname='영업부'

  where deptno=30;        


SQL> select * from dept3;


    DEPTNO DNAME                        LOC

---------- ---------------------------- --------------------------

        10 ACCOUNTING                   NEW YORK

        30 영업부                       CHICAGO


ROLLBACK;

-- 트랜잭션내의 모든 DML작업 취소.


SQL> select * from dept3;


    DEPTNO DNAME                        LOC

---------- ---------------------------- --------------------------

        10 ACCOUNTING                   NEW YORK

        20 RESEARCH                     DALLAS

        30 SALES                        CHICAGO

        40 OPERATIONS                   BOSTON


문제) 10,20,30번 부서를 삭제하시오.

   delete from dept3

   where deptno in (10,20,30); 


SQL> select * from dept3;


    DEPTNO DNAME                        LOC

---------- ---------------------------- --------------------------

        40 OPERATIONS                   BOSTON


COMMIT;   -- 물리적인 반영

ROLLBACK;    


SQL> select * from dept3;


    DEPTNO DNAME                        LOC

---------- ---------------------------- --------------------------

        40 OPERATIONS                   BOSTON

        

<SAVEPOINT>: 저장점

  형식) SAVEPOINT 저장점명;

  

drop table dept4;

create table dept4

as select * from dept;


SQL> select * from dept4;


    DEPTNO DNAME                        LOC

---------- ---------------------------- --------------------------

        10 ACCOUNTING                   NEW YORK

        20 RESEARCH                     DALLAS

        30 SALES                        CHICAGO

        40 OPERATIONS                   BOSTON


- 30번 부서삭제

  delete from dept4

  where deptno=30;

          

SQL> select * from dept4;


    DEPTNO DNAME                        LOC

---------- ---------------------------- --------------------------

        10 ACCOUNTING                   NEW YORK

        20 RESEARCH                     DALLAS

        40 OPERATIONS                   BOSTON


=================================> SAVEPOINT

  savepoint sp1;


- 20번 부서삭제

  delete from dept4

  where deptno=20;


SQL> select * from dept4;


    DEPTNO DNAME                        LOC

---------- ---------------------------- --------------------------

        10 ACCOUNTING                   NEW YORK

        40 OPERATIONS                   BOSTON

  

=================================> SAVEPOINT

  savepoint sp2;


- 10번 부서삭제

  delete from dept4

  where deptno=10;


SQL> select * from dept4;


    DEPTNO DNAME                        LOC

---------- ---------------------------- --------------------------

        40 OPERATIONS                   BOSTON

        

SQL> rollback to sp2;


SQL> select * from dept4;


    DEPTNO DNAME                        LOC

---------- ---------------------------- --------------------------

        10 ACCOUNTING                   NEW YORK

        40 OPERATIONS                   BOSTON


SQL> rollback to sp1;


SQL> select * from dept4;


    DEPTNO DNAME                        LOC

---------- ---------------------------- --------------------------

        10 ACCOUNTING                   NEW YORK

        20 RESEARCH                     DALLAS

        40 OPERATIONS                   BOSTON

        

SQL> rollback;                


SQL> select * from dept4;


    DEPTNO DNAME                        LOC

---------- ---------------------------- --------------------------

        10 ACCOUNTING                   NEW YORK

        20 RESEARCH                     DALLAS

        30 SALES                        CHICAGO

        40 OPERATIONS                   BOSTON

        

drop table dept4;

create table dept4

as select * from dept;


delete from dept4

where deptno=40;


savepoint sp3;


delete from dept4

where deptno=20;


commit;


rollback to sp3;


ORA-01086: savepoint 'SP3' never established in this session 

           or is invalid

           

==> commit 이전에 정의된 savepoint는 사용할 수 없음!!              

'Programming > DataBase' 카테고리의 다른 글

[Oracle] PL/SQL  (0) 2017.11.09
[Oracle] 시퀀스(Sequence)  (0) 2017.11.09
[Oracle] 뷰 (View) 단일뷰/복합뷰  (0) 2017.11.08
[Oracle] 제약조건 (Constraint)  (2) 2017.11.07
[Oracle] Merge 테이블 합치기  (2) 2017.11.07
Comments