DB/SQL

TCL

이파댥 2024. 7. 8. 19:41
/*
TCL (TRANSACTION CONTROL LANGUAGE) : 트랜잭션 제어 언어

Transaction : 업무, 처리

변경된 사항을 묶어서 하나의 트랜잭션에 처리

트랜잭션에서 데이터 변경 대상 : INSERT, UPDATE, DELETE (DML)

Ex) 
    INSERT INTO 값 추가 ---------------------------------> DB 반영 X
    INSERT INTO 값 추가 -----트랜잭션에 추가-------COMMIT---> DB 반영 O
    INSERT INTO 10 번 값 추가 ---> 1 개 트랜잭션에 10 개 추가 -- ROLLBACK ---> DB 반영 X
    
    1) COMMIT : 메모리 트랜잭션에 임시 저장된 데이터를 DB 에 완전히 추가
    
    2) ROLLBACK : 메모리 트랜잭션에 임시 저장된 데이터를 삭제하고 
                  마지막 COMMIT 상태로 돌아감
    
    3) SAVEPOINT : 메모리 트랜잭션에 저장 지점을 정의 
                   ROLLBACK 을 수행할 경우 전체 작업을 삭제하는 것이 아닌
                   저장 지점까지만 일부 ROLLBACK
    
    
*/

-- 복제 테이블 DEPARTMENT3 
CREATE TABLE DEPARTMENT3 AS SELECT * FROM DEPARTMENT;

SELECT * FROM DEPARTMENT3;

-- 1) COMMIT 예제
---> D0 경리부 L2 삽입
INSERT INTO DEPARTMENT3 
VALUES ('D0','경리부','L2');

SELECT * FROM DEPARTMENT3;
---> D9 인 부서의 이름과 지역코드를 전략기획팀 L3 수정
UPDATE DEPARTMENT3
SET DEPT_TITLE = '전략기획팀',
    LOCATION_ID = 'L3'
WHERE DEPT_ID = 'D9';

SELECT * FROM DEPARTMENT3;
-- 추가와 수정된 사항들을 최종 저장
COMMIT; -- 완벽하게 저장완료

ROLLBACK; -- 완벽하게 저장이 된 상태에서 돌아가기를 진행하면
-- 커밋이 완료된 시점으로 돌아감

SELECT * FROM DEPARTMENT3;


-- 2) ROLLBACK 예제
--- DEPT_ID D0 인 행을 삭제
DELETE FROM DEPARTMENT3
WHERE DEPT_ID = 'D0';

SELECT * FROM DEPARTMENT3;

---- DELETE DEPT_ID D9 인 행을 삭제
DELETE FROM DEPARTMENT3
WHERE DEPT_ID = 'D9';

-- DEPT_ID D8 인 행을 삭제, 삭제한 내역 되돌리기
DELETE FROM DEPARTMENT3
WHERE DEPT_ID = 'D8';

ROLLBACK; -- 마지막 커밋 이후의 것들을 없앰


-- 3) SAVEPOINT 예제
--- SAVEPOINT 작성해준 후 저장지점 이름 설정

-- DEPT_ID 가 D0 인 행을 삭제

DELETE FROM DEPARTMENT3
WHERE DEPT_ID = 'D0';

SAVEPOINT "SP1"; -- SP1 이라는 저장 지점 설정

-- DEPT_ID 가 D9 인 행을 삭제
DELETE FROM DEPARTMENT3
WHERE DEPT_ID = 'D9';

SAVEPOINT "AAA"; -- AAA 라는 저장 지점 설정

-- DEPARTMENT3 전체삭제
DELETE FROM DEPARTMENT3;

SELECT * FROM DEPARTMENT3; -- 실수로 전체 삭제

ROLLBACK;
-- AAA 까지 돌아가고싶다
ROLLBACK TO "AAA"; --- AAA 시점으로 저장된 DB 내역이 돌아옴

-- SP1 까지 되돌리기
ROLLBACK TO "SP1";

SELECT * FROM DEPARTMENT3;

-- 모든 내역 SP1 이전으로 되돌리기
ROLLBACK;