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