/*- 08_트랜잭션.sql -*/

/*
 * # 트랜잭션 ( transaction )
 * - 데이터베이스 내에서 하나의 그룹으로 처리되어야 하는 명령문들을 모아 놓은 작업 단위.
 * - 여러개의 명령어의 집합이 정상적으로 처리되면 정상 종료하도록 하고,
 *   여러개의 명령어 중에서 하나의 명령어라도 잘 못 되었다면 전체를 취소.
 *
 * # 트랜잭션 명령어
 * - COMMIT  
 *   ROLLBACK
 *   SAVEPOINT
 */
 
/*
 * # COMMIT
 * - 모든 작업을 정상적으로 처리하겠다고 확정하는 명령어.
 * - 트랜잭션의 처리 과정을 데이터베이스에 반영하기 위해 변경된 내용을 모두 영구 저장.
 * - COMMIT을 수행하면 하나의 트랜잭션 과정을 완료.
 */

/*
 * # ROLLBACK
 * - 작업중 문제가 발생했을 때, 트랜잭션의 처리 과정에서 발생한 변경 사항을 취소하고 트랜잭션 과정을 종료.
 * - 이전 COMMIT 한 곳까지만 복구.
 */
 
-- 연습 테이블
DROP TABLE DETP01 PURGE;
CREATE TABLE DETP01 AS SELECT * FROM DEPT;
SELECT * FROM DEPT01;

-- DEPT01 테이블 내용 삭제
DELETE FROM DEPT01;
SELECT * FROM DEPT01;

-- ROLLBACK 을 수행해서 데이터 복구
ROLLBACK;
SELECT * FROM DEPT01;

-- 부서번호 20번 삭제
DELETE FROM DEPT01 WHERE DEPTNO=20;
SELECT * FROM DEPT01;

-- 데이터 삭제한 결과를 영구 저장하기 위해 COMMIT 수행.
COMMIT;
SELECT * FROM DEPT01;

-- ROLLBACK을 수행해서 데이터 복구 -> COMMIT 과정한 곳 까지 ROLLBACK 됌.
ROLLBACK;
SELECT * FROM DEPT01;

/*
 * # AUTO COMMIT
 * - DDL 문 ( ALTER, DROP, RENAME ) 은 자동으로 COMMIT 진행.
 */ 

DROP TABLE DETP02 PURGE;
CREATE TABLE DETP02 AS SELECT * FROM DEPT;
SELECT * FROM DEPT02;

-- 부서번호 40번 삭제
DELETE FROM DEPT02 WHERE DEPTNO=40;
SELECT * FROM DEPT02;

-- DDL 행 실행. Auto COMMIT
DROP TABLE DETP03 PURGE;
CREATE TABLE DETP03 AS SELECT * FROM DEPT;
SELECT * FROM DEPT03;

-- ROLLBACK 명령문을 실행했지만, DDL문이 먼저 수행되면서 자동 COMMIT이 진행되어 복구되지않음.
ROLLBACK;
SELECT * FROM DEPT02;

/*
 * # SAVEPOINT
 * - 현재의 트랜잭션을 분할하는 명령어.
 * - 
 */
DROP TABLE DEPT01 PURGE;
CREATE TABLE DEPT01 AS SELECT * FROM DEPT;
SELECT * FROM DEPT01;

-- 40번 부서 삭제 -> SAVEPOINT 
DELETE FROM DEPT01 WHERE DEPTNO=40;
COMMIT;
SELECT * FROM DEPT01;

-- 30번 부서 삭제 -> SAVEPOINT D30
DELETE FROM DEPT01 WHERE DEPTNO=30;
SAVEPOINT D30;
SELECT * FROM DEPT01;

-- 20번 부서 삭제 -> SAVEPOINT D20
DELETE FROM DEPT01 WHERE DEPTNO=20;
SAVEPOINT D20;
SELECT * FROM DEPT01;

-- 10번 부서 삭제 -> SAVEPOINT D10
DELETE FROM DEPT01 WHERE DEPTNO=10;
SAVEPOINT D10;
SELECT * FROM DEPT01;

ROLLBACK TO D20;