KIC/ORACLE

[Oracle] 트랜잭션

octopengj 2020. 10. 12. 14:52

<문1>데이터베이스에서 데이터를 관리(insert,update,delete,select)

여러개의 SQL명령어를 사용하게 되는데 이를 하나의 작업단위로 설정

ex) 계좌이체(A은행---->B은행)

          -1000 ---->+1000

            수정          입금(=insert)

            update       insert=====>작업단위

                   정전

 

트랜잭션의 처리요건=>ALL or Nothing (원자성)

        반드시 처리가 되든지 or 처리 X

                          commit or rollback

 

COMMIT

모든 작업들을 정상적으로 처리 데이터베이스에 모두 반영--->메모리에 저장=>테이블에 적용이 된다.

변경된 내용을 모두 영구 저장-->테이블에 저장(insert,update,delete)

 

(주의할점)=>** 자동 commit이 되는 경우 **

 

1.create table,create view~ ,alter~,drop~으로 시작하는 문장(DDL)은 복구불가

   DCL문(grant~,revoke) 사용권한 복구불가

 

2.insert,update,delete->commit을 입력하지 않아도 exit(정상종료)

   메모리상에 미처 저장하지 못했던 모든 부분->테이블에 저장시켜주고

   종료

 

 

 

ROLLBACK

commit이 되면 그 작업이 끝난상태로 취급->취소가 불가능

처리 과정에서 발생한 변경 사항을 취소->메모리상에 저장된 결과물

                                             (insert,update,delete)

 

자동 rollback

 

->비정상적인 종료(정전),다운

 

 

실행 과정

SQL> create table  b_dept2 as select * from dept;
테이블이 생성되었습니다.
SQL> select * from b_dept2;

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

1 개의 행이 만들어졌습니다.
SQL> select * from b_dept2;

    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON
        50 SUPPORT        KWANGJU
SQL> commit;

커밋이 완료되었습니다.
SQL> insert into b_dept2 values(60, 'TESTING', 'SEOUL');

1 개의 행이 만들어졌습니다.
SQL> select * from b_dept2;

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

6 개의 행이 선택되었습니다.
SQL> savepoint A;

저장점이 생성되었습니다.
SQL> update b_dept2 set dname='IMSI' where deptno=50;

1 행이 갱신되었습니다.
SQL> select * from b_dept2;

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

6 개의 행이 선택되었습니다.
SQL> savepoint B;

저장점이 생성되었습니다.
SQL> select * from b_dept2;

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

6 개의 행이 선택되었습니다.
SQL> delete from b_dept2 where deptno=40;

1 행이 삭제되었습니다.
SQL> select * from b_dept2;

    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        50 IMSI           KWANGJU
        60 TESTING        SEOUL
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           KWANGJU
        60 TESTING        SEOUL

6 개의 행이 선택되었습니다.
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        KWANGJU