SQL> DELTE 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는 사용자가 트랜잭션의 작업을 여러개의 세그먼트로 분할할 수 있도록 하는 특별한 작업
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 후에 실행된 데이터 입력은 삭제되었다.