4.6 Commit과 Rollback 예제

출처 URL : http://www.gurubee.net/lecture/1022

COMMIT 과 ROLLBACK

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

  • – 자동 COMMIT : DDL(Create, Alter, Drop), DCL(Grant, Revoke)
  • – 자동 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번인 데이터를 등록 한 후 
   COMMIT으로 데이터를 저장한 다음에 데이터를 다시 삭제한 후 
   SELECT를 하면 데이터가 검색되지 않는 것을 알 수 있다.

-- 하지만 다른 유저에서는 커밋이나 롤백을 하기 전까지 이전에 등록한 
   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 );
한 개의 행이 작성되었습니다.

-- SAVEPOINT를 생성 한다.
SQL> SAVEPOINT A;
저장점이 생성되었습니다. 

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);
선택된 행이 없습니다.

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

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

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

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

참고링크

SQL 전문가 가이드 – 제4절 TCL(Transaction Control Language)


답글 남기기 0

Your email address will not be published. Required fields are marked *