Notice: Function _load_textdomain_just_in_time was called incorrectly. Translation loading for the ultimate-member domain was triggered too early. This is usually an indicator for some code in the plugin or theme running too early. Translations should be loaded at the init action or later. Please see Debugging in WordPress for more information. (This message was added in version 6.7.0.) in /ledcorps/www/wp/wp-includes/functions.php on line 6114 4.6 Commit과 Rollback 예제 – 대나무숲

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 *