본문 바로가기

Database

[SQL] TCL(COMMIT, ROLLBACK, SAVEPOINT)

TCL : TRANSACTION CONTROL LANGUAGE

- DML에 의해 조작된 결과를
  논리적 작업단위(트랜잭션) 별로 제어하는 명령어

TRANSACTION

-데이터베이스의 ' 논리적 ' 연산단위
- COMMIT(확정)까지의 데이터 변경사항(DML)들을 하나의 트랜젝션으로 묶어서 처리

- 트랜잭션의 대상이 되는 SQL문 :
INSERT, UPDATE, DELETE
(SELECT는 데이터에 변경을 가하지 않으므로 영향 없음)

TRANSACTION의 종류

1) COMMIT : 하나의 트랜젝션에 담겨있는 변경사항들(DML들)을 실제 DB에 반영
--> COMMIT 후 트랜젝션은 비워짐
2) ROLLBACK: 하나의 트랜젝션에 담겨있는 변경사항들(DML들)을 삭제하고 마지막 커밋시점으로 돌아감
3) SAVEPOINT : 지금 시점을 임시저장점으로 정의

-> DDL구문 (CREATE, ALTER, DROP)을 실행하는 순간
기존에 트렌잭션에 있는 모든 변경사항들을 무조건 실제 DB에 반영(COMMIT)
그 다음 DDL이 수행됨
따라서 , 변경사항이 있다면 DDL 실행 전 정확히 FIX (COMMIT, ROLLBACK)후 DDL을 수행해야 함
DDL문이 수행되면 변경 불가!

** 중요: DML을 사용하면 COMMIT, ROLLBACK 둘 중하나(트랜젝션 처리) 무조건 해야함

 

-- 테이블명 EMP_02
-- EMPLOYEE 복사
CREATE TABLE EMP_02 
AS SELECT * FROM EMPLOYEE;
SELECT * FROM EMP_02;

-- 사번이 221인 사원 삭제
DELETE FROM EMP_02 
WHERE EMP_ID = 221;

-- 사번이 220인 사원 삭제

DELETE FROM EMP_02 
WHERE EMP_ID = 220;

ROLLBACK;

DELETE FROM EMP_02 
WHERE EMP_ID = 220;


-- 사번 800, 이름 홍길동 사원 추가
INSERT INTO EMP_02 (EMP_ID, EMP_NAME, EMP_NO, JOB_CODE, SAL_LEVEL) VALUES(800, '홍길동', '12345-5566666', 'J1', 'S1');


COMMIT;


SELECT * FROM EMP_02; 
ROLLBACK;


--------------2단계 끝 -----
-- 사번이 217. 216, 214인 사원 삭제
DELETE FROM EMP_02
  WHERE EMP_ID IN (217, 216, 214);



----3개행이 삭제된 시점에서 SAVEPOINT 지정
SAVEPOINT SP1;

DELETE FROM EMP_02
WHERE EMP_ID = 200;
SELECT * FROM EMP_02; 


ROLLBACK TO SP1 ; 
COMMIT;

SELECT * FROM EMP_02;

DELETE FROM EMP_02
WHERE EMP_ID = 800;

--TABLE 생성(DDL)
CREATE TABLE TEST(
    TID NUMBER 
);

ROLLBACK;









'Database' 카테고리의 다른 글

[SQL] 시퀀스 SEQUENCE  (1) 2022.10.05
[SQL] 뷰 VIEW  (1) 2022.10.05
[SQL] DCL - GRANT, REVOKE  (1) 2022.10.05
[SQL] DDL - CREATE/ ALTER/ DROP  (0) 2022.10.05
[SQL] DML - INSERT/ UPDATE /DELETE  (0) 2022.10.04