반응형
250x250
Notice
Recent Posts
Recent Comments
Link
관리 메뉴

Yeonee's Story

Oracle SQL - TCL (TRANSACTION CONTROL LANGUAGE), 트랜잭션(TRANSACTION), COMMIT, ROLLBACK, SAVEPOINT, ROLLBACK TO 본문

Oracle SQL/Oracle SQL

Oracle SQL - TCL (TRANSACTION CONTROL LANGUAGE), 트랜잭션(TRANSACTION), COMMIT, ROLLBACK, SAVEPOINT, ROLLBACK TO

yeonee 여니 2023. 6. 13. 13:51
728x90
반응형
SMALL

안녕하세요.
여니입니다 :)

 

/*
    * TCL (TRANSACTION CONTROL LANGUAGE)
    트랜잭션을 제어하는 언어
    
    * 트랜잭션(TRANSACTION)
    - 데이터베이스의 논리적 작업 단위
    - 데이터의 변경사항(DML)들을 하나의 트랜잭션으로 묶어서 처리
      => COMMIT(확정)하기 전까지의 변경사항들을 하나의 트랜잭션으로 담겠다.
    - 트랜잭션의 대상이 되는 SQL : INSERT, UPDATE, DELETE(DML)
    
    * 트랜잭션의 종류
    - COMMIT; : 하나의 트랜잭션에 담겨있는 변경사항들을 실제 DB에 반영하겠다는 것을 의미함.
                실제 DB에 반영시킨후 트랜잭션은 비워짐 => 확정의개념
    - ROLLBACK; : 하나의 트랜잭션에 담겨있는 변경사항들을 실제 DB에 반영하지 않겠다는
    것을 의미. 트랜잭션에 담겨있는 변경사항도 다 삭제한 후 마지막 COMMIT 시점으로 돌아감
    - SAVEPOINT 포인트명; : 현재 이 시점에 임시저장점을 정의해 두는것
    - ROLLBACK TO 포인트명; : 전체 변경사항들을 삭제(마지막 COMMIT시점까지 돌려놓기)
    하는것이 아니라 해당 포인트지점까지의 트랜잭션을 롤백한다.
*/
SELECT * FROM EMP_01; -- 25명

-- 사번이 901인 사원 삭제
DELETE FROM EMP_01
WHERE EMP_ID = 901;

-- 900인 사원 삭제
DELETE FROM EMP_01
WHERE EMP_ID = 900;

ROLLBACK; -- 25명으로 복구

-------------------------------------------------------------------------------

-- 사번이 200인 사원 삭제
DELETE FROM EMP_01
WHERE EMP_ID = 200;
-- 사번 800, 이름 홍길동, 부서 총무부 인 사원추가
INSERT INTO EMP_01
VALUES(800,'홍길동','총무부');

COMMIT; -- 25

SELECT * FROM EMP_01;

ROLLBACK; --25명: 트랜잭션의 대상이 되는 SQL문중에 SELECT문 없다.(롤백할 변경사항이 없다)
--------------------------------------------------------------------------------
-- EMP_01테이블에서 사번이 217, 216, 214인 사원 삭제
DELETE FROM EMP_01
WHERE EMP_ID IN (217, 216, 214);

SELECT * FROM EMP_01; -- 22명
-- 3개의 행이 삭제된 시점을 SAVEPOINT로 지정
SAVEPOINT SP1;

-- EMP_01테이블에 사번 801, 이름 김말똥, 부서 인사부인 사원을 추가
INSERT INTO EMP_01
VALUES(801, '김말똥', '인사부'); -- 24명

--EMP_01 테이블에 사번이 218인 사원 삭제
DELETE FROM EMP_01
WHERE EMP_ID=218; -- 23명

SELECT * FROM EMP_01; -- 23명

ROLLBACK TO SP1; -- SAVEPOINT 지정 전 마지막 SELECT한 시점과 동일한 결과가 나올것
SELECT * FROM EMP_01; -- 22명

COMMIT;

-- 사번이 900, 901인 사원 삭제
DELETE FROM EMP_01
WHERE EMP_ID IN (900, 901);

SELECT * FROM EMP_01; -- 20명

-- 테이블 생성(DDL)
CREATE TABLE TEST(
    TID NUMBER
);
SELECT * FROM EMP_01; -- 20명

ROLLBACK;

SELECT * FROM EMP_01; -- 22명(X) 20명(O)
/* 
    주의사항) ★ (데이터 연동활용시 데이터 확인 후 COMMIT안하면 데이터 출력안됨)
    DDL 구문(CREATE , ALTER , DROP)을 실행하는 순간
    기존에 트랜잭션에 있던 모든 변경사항들을 무조건 실제 DB에 반영 시킨후에 DDL이 수행됨
    => 즉, DDL 수행전에 변경사항이 있었다면 정확하게 픽스(COMMIT OR ROLLABCK)를
    하고 DDL을 실행해야 한다.
*/




728x90
반응형
LIST