본문 바로가기
클라우드 활용 자바개발자 양성과정/02. 데이터베이스 활용

09. TCL(COMMIT, ROLLBACK + SAVEPOINT)

by moca7 2024. 7. 24.

 

ㅁ DCL은 데이터 제어어

TCL은 트랜잭션 제어어

 

ㅁ < TCL >

- Transaction Contol Language 트랜잭션 제어어

- 트랜잭션데이터베이스의 논리적 연산단위(업무단위)

- 데이터의 변경이 실제 바로 DB에 반영되지 않음. 추가, 수정, 삭제가 된 것처럼 보이지만 실제론 안되어있음.

변경 사항들이 하나의 트랜잭션으로 묶여있다.

 

 

ㅁ TCL 종류

- COMMIT : 트랜잭션에 포함되어있는 변경사항실제 DB에 반영시키고 트랜잭션 소멸

- ROLLBACK : 트랜잭션에 포함되어있는 변경사항삭제(취소)한 후 트랜잭션 소멸

 

- SAVEPOINT : 현재 시점에 특정 세이브포인트명으로 임시저장점을 만든다.

                          롤백시 전체 취소가 아니라 일부만 롤백 가능.

 

ㅁ 트랜잭션의 처리 대상이 되는 SQL문은 DML(INSERT, UPDATE, DELETE)

- 이런 것들은 바로 DB에 반영되지 않고 트랜잭션에 쌓여있다.

- DDL은 AUTO COMMIT

 

 

ㅁ 예시

 

ㅇ 사번이 900, 901인 사원 데이터 삭제하고 ROLLBACK하기.

 

SELECT *
FROM EMP_NEW;

 

DELETE FROM EMP_NEW WHERE EMP_ID=900;
DELETE FROM EMP_NEW WHERE EMP_ID=901;

 

ROLLBACK;

 

- 데이터 2개 지웠다고 롤백도 두번 해야하는 것은 아님. 한번만 해도 모두 롤백됨.

트랜잭션이 각각 따로 관리되는게 아니고, 없으면 만들고 있으면 거기에 추가함.

- 데이터 추가, 수정, 삭제가 실제 DB에 바로 반영되는 것이 아니라, 트랜잭션에 두 문장이 묶여있다.

ROLLBACK하면 DB에 반영하지 않은 채로 트랜잭션이 그대로 소멸됨.

- INSERT, UPDATE, DELETE 다 ROLLBACK 됨. 

 

 

ㅇ 사번이 900, 901인 사원 데이터 삭제하고 COMMIT 후 ROLLBACK하기

 

SELECT *
FROM EMP_NEW;

 

DELETE FROM EMP_NEW WHERE EMP_ID=900;
DELETE FROM EMP_NEW WHERE EMP_ID=901;

 

COMMIT;

ROLLBACK;

 

- COMMIT한 순간 되돌릴 수 없음.

COMMIT은 트랜잭션에 담겨있는 변경 사항실제 DB에 반영시키는 명령어.

 

 

 

ㅇ SAVEPOINT 활용하기 

 

 

SELECT *
FROM EMP_NEW;

DELETE FROM EMP_NEW WHERE EMP_ID=900;
DELETE FROM EMP_NEW WHERE EMP_ID=901;

SAVEPOINT SP;

DELETE FROM EMP_NEW WHERE EMP_ID=999;

 

ROLLBACK;

 

- 이러면 3개 데이터 삭제한게 전부 롤백됨. 세이브 포인트 의미가 없음.

 

 

ㅇ SAVEPOINT 활용하기2

 

 

SELECT *
FROM EMP_NEW;

DELETE FROM EMP_NEW WHERE EMP_ID=900;
DELETE FROM EMP_NEW WHERE EMP_ID=901;

SAVEPOINT SP;

DELETE FROM EMP_NEW WHERE EMP_ID=999;

 

ROLLBACK TO SP;

 

- 트랜잭션에 2개 데이터 삭제, SP, 1개 데이터 삭제가 쌓여있음.

이 상황에서 ROLLBACK TO SP를 하면, SP 이후에 한해서 ROLLBACK을 함.

- 현시점부터 세이브포인트까지 구간을 ROLLBACK한다.

- 그런데 ROLLBACK TO SP; 하고 ROLLBACK;을 또 하면 3개 데이터 다 살아남.

 

 

 

ㅁ DDL

 

SELECT *
FROM EMP_NEW;

DELETE FROM EMP_NEW WHERE EMP_ID=900;
DELETE FROM EMP_NEW WHERE EMP_ID=901;

DELETE FROM EMP_NEW WHERE EMP_ID=999;

 

CREATE TABLE TEST( TID NUMBER );        //          DDL문 사용

 

ROLLBACK;

 

- 롤백이 안된다. COMMIT을 한 적이 없는데 롤백이 안 됨.

DDL문 쓰는 순간 AUTO COMMIT.

 

 

ㅁ 웹 개발시 기능(요청) 단위로 트랜잭션으로 묶어 관리

 

 

ㅇ 게시글 작성 기능 예제

 

INSERT INTO 게시글 VALUES(사용자가입력한 게시글 제목, 내용, ...);

INSERT INTO 첨부파일 VALUES(게시글의 첨부파일 원본명, 수정명, 저장경로, ...);

 

- 한 개의 기능에 있어서 여러 DML이 수행될 수 있음.

- 게시글 INSERT는 성공했는데, 첨부파일 INSERT는 실패함. 이럴 때 ROLLBACK을 하면 둘 다 취소가 됨.

둘 다 성공했으면 COMMIT하면 되고.