/*- 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;