Oracle SQL 강좌
Commit과 Rollback 예제 9 13 99,999+

by 구루비 COMMIT ROLLBACK SAVEPOINT ROLLBACK TO 읽기일관성 [2002.01.20]


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 후에 실행된 데이터 입력은 삭제되었다. 
    

참고링크

- 강좌 URL : http://www.gurubee.net/lecture/1022

- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^

- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.

by 김영석 [2005.06.23 21:19:21]
감사합니다.
잘 읽었습니다.

by 그누세상 [2005.10.15 03:49:54]
잘 읽었습니다.^^

by smile [2005.11.09 20:05:07]
퍼갑니다. ^^

by 짝짝작 [2006.05.09 17:49:17]
와~ 가슴아픈 쿼리 문인데요.
웃음이 나요 ^^;;

롤백했으니 다시 그시절로 돌아갈 겁니다.

by 끼비르 [2006.05.12 09:48:20]
시근땀님.. 제가 추천드릴것은 TRUNCATE girlfriend ; 입니다..
그런 시정잡베에 홀려 시근땀님을 버린 그분 롤벡여지없이...
TBUNCATE 추천드립니다..

by 신선동 [2006.08.31 17:25:32]
정말 설명잘들었구요...여기만큼 정리가 잘된 사이트는 없는것같아요..

by 김컴 [2011.06.23 11:22:31]
재밌어요~~우와 감사합니다

by 프리어 [2011.10.09 23:04:36]
재밌게 보고 있습니다...ㅋㅋㅋ

by 오라쟁이 [2011.12.22 16:22:34]
유용한 정보 잘 읽었습니당.

by 손님 [2012.11.13 10:51:45]

오늘 데이터 삭제 작업을 하다가 잘봇 테이블을 날려서 엄청 고생하고 이걸 찾아봤는데요..
전 COMMIT까지 날린상태에서 ROLLBACK을 했습니다.
그랬더니 다시 데이터가 나오던데 어떻게 된걸까요..
이강좌를 봐도 그 부분이 이해가 잘 안가네요.... 알려주세요~~~

ROLLBACK이 COMMIT한 부분도 되돌려주는지 알고 싶네요

by 귀여니^^ [2014.12.26 19:09:25]

rollback 은 commit 이전으로 돌릴 수 없습니다.

commit 을 해버리면..그대로 끝..ㅋ

그래서 savepoint , rollback to 가 존재하는거 같애요^^

 

지금은 당연히 아시겠지만..

혹시 궁금해 하시는 다른 분들이 있을 수도 있을까봐 답변 달아봤습니당..ㅎ

 


by 귀여니^^ [2014.12.26 19:13:53]
 

혹시 현재 transaction 에서 사용한 savepoint 의 목록을 확인할 수 있는 방법이 있나요?

행을 위로 올려서 확인하는 거 말구요^^;

긴 쿼리 여러개를 사용하는 경우도 있으니까요..

DBMS 에서 제공하지 않는다면

토드 같은 툴에서 제공이 되는지..궁금합니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입