오라클 트랜젝션 Commit, Rollback , Savepoint예제

Commit 과 Rollback

  
이전의 커밋(COMMIT)이 일어난 뒤부터 다음의 커밋(COMMIT) 전까지의 작업이 하나의 트랜
잭션 이며
, 커밋과 롤백(ROLLBACK)은 이러한 트랜잭션 단위로 데이터 베이스에서 발생한
작업을 저장, 삭제하는 일입니다.

 
- Automatic commit : DDL(Create, Alter, Drop), DCL(Grant, Revoke)

 
- Automatic Rollback: 비정상적인 종료, system failure  
 
커밋과 롤백 예제입니다.








SQL>DELETE FROM  emp WHERE empno = 7521 ;
       한 개의 행이 삭제 되었습니다.

SQL>COMMIT;
      커밋이 완료 되었습니다
 
  한 개의 행을 삭제하고, COMMIT 문으로 데이터를 영구히 저장했습니다. 이 것은 하나의 트랜잭션이 여기서 종료되고 새로운 트랜잭션이 발생하는 것을 말합니다.

SQL>SELECT empno FROM EMP WHERE empno = 7521;
       선택된 레코드가 없습니다.



SQL>INSERT INTO emp(empno, ename, hiredate) VALUES(9000, 'test', sysdate );
     한 개의 행이 작성되었습니다.

SQL>COMMIT;
     커밋이 완료 되었습니다.

SQL>DELETE FROM emp WHERE empno = 9000;
     한 개의 행이 삭제 되었습니다.

SQL>SELECT empno FROM emp WHERE empno = 9000 ;
       선택된 레코드가 없습니다.  


의 예제를 보면은 empno가 9000번인 데이터를 Insert한 후 commit으로 데이터를 저장한 다음에
데이터를 다시 삭제한 후 Select를 해보면 데이터가 검색되지 않는 것을 알 수 있습니다.

하지만 다른 유저에서는 커밋이나 롤백을 하기 전까지 이전에 Insert한 empno가 9000번인 데이터를
조회하면 데이터가 검색 됩니다.

데이터베이스에서의 이런 기능을 읽기 일관성이라고 합니다.


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

(이전에 트랜잭션(커밋)이 발생하고나서 지금 발생한 ROLLBACK 문 전까지의 작업의 취소를 말합니다. )


검색을 해보면 커밋이 완료된 시점의 레코드 하나가 검색 됩니다.
SQL>SELECT  empno FROM  emp WHERE empno = 9000 ;

   EMPNO
----------
      9000
     한 개의 행이 선택되었습니다.










SAVEPOINT 와 ROLLBACK TO

  SAVEPOINT
는사용자가 트랜잭션의 작업을 여러개의 세그먼트로 분할할 수 있도록 하는 특별한
 작업입니다.
 SAVEPOINT는 부분적인 롤백을 가능하게 하기 위해 트랜잭션에 대한 중간점을 정의 합니다.
 







SQL>INSERT INTO emp(empno, ename, hiredate) VALUES(10000, 'test2', sysdate );
       한 개의 행이 작성되었습니다.

SQL>SAVEPOINT A;
       저장점이 생성되었습니다. (여기서 SAVEPOINT를 생성했습니다.)

SQL>INSERT INTO emp(empno, ename, hiredate) VALUES(10001, 'test3', sysdate );
     
  한 개의 행이 작성되었습니다.

SQL>INSERT INTO emp(empno, ename, hiredate) VALUES(10002, 'test4', sysdate );
   
    한 개의 행이 작성되었습니다.

SQL>DELETE FROM emp WHERE empno IN(10000, 10001, 10002);
       세 개의 행이 삭제 되었습니다.

SQL>SELECT empno, ename FROM emp WHERE empno IN(10000, 10001, 10002);
    
   선택된 행이 없습니다.

SQL>ROLLBACK TO A;
        롤백이 완료되었습니다. (SAVEPOINT까지만 롤백이 시행됩니다.)

SQL>SELECT empno , ename FROM emp WHERE empno IN(10000, 10001, 10002);
        한 개의 행이 선택되었습니다.

     EMPNO ENAME
--------- ---------------
    10000 test2

  SAVEPOINT까지만 롤백이 실행되었습니다. 그 결과 첫 번재 데이터는 그대로 남고,
 SAVEPOINT 후에 실행된 데이터 입력은 삭제되었습니다.