본문 바로가기
멀티캠퍼스 풀스택 과정/데이터베이스

데이터베이스2-6 트랜잭션, SAVEPOINT와 ROLLBACK TO

by 이쟝 2022. 1. 19.

데이터제어언어: TCL(Transaction Control Language)

 

SQL 내용
COMMIT 데이터베이스 트랜잭션의 내용의 업데이트를 영구적으로 확정한다.
ROLLBACK 데이터베이스에서 업데이트 오류가 발생할 때, 이전상태로 되돌리는 것을 말한다.
SAVEPOINT 특정부분에서 트랜잭션을 취소시킬 수 있다.

 

- 트랜잭션은 테이블 데이터를 변경(입력/수정/삭제)할 떄 실제 테이블에 완전히 적용하지 않고, 임시로 적용시키는 것을 말한다. 그래서 만약 실수가 있었을 경우에 임시로 적용시킨 것을 취소시킬 수 있게 해준다. 

- Oracle은 트랜잭션 처리 가능한데 Mysql은 트랜잭션 처리 불가(오토커밋)

- TRANSACTIOM은 데이터를 데이터를 일관되게 변경하는 DML 문장(CRUD)으로 구성된다.

 

TRANSACTION의 시작 실행 가능한 SQL 문장이 제일 처음 실행될 때
TRANSACTION의 종료 COMMIT이나 ROLLBACK
DDL이나 DCL문장의 실행(자동 COMMIT)
기계장애 또는 시스템 충돌
deaklock 발생 사용자가 정상 종료

 


1. COMMIT ROLLBCK

- 이전의 커밋(COMMIT)이 일어난 뒤부터 다음의 커밋(COMMIT)전 까지의 작업이 하나의 트랜잭션이고, 커밋과 롤백(ROLLLBACK)은 이러한 트랜잭션 단위로 데이터베이스에서 발생한 작업을 저장, 삭제하는 일이다.

- COMMIT: 변경사항 저장, ROLLBACK: 변경사항 취소

 

1) AUTOCOMMIT을 확인후에 자동커밋을 해제 시켜주기

> SELECT @@autocommit; -- 1: 자동커밋, 0: 자동커밋아님

 

자동으로 1이 설정되어 있다.

 

> SET autocommit = 0;     -- 0으로 바꿔준다. (AUTOCOMMIT 해제)

> SELECT @@autocommit;

 

오토커밋을 해제했다. 

 

2)  COMMIT

 

-- 사원 생성

> INSERT INTO emp(empno, ename) VALUES (1111, 'lee');

-> 사원번호가 1111이고, 이름이 lee인 사원의 데이터를 생성했다.

더보기

-> 현재 완료된 데이터가 아니고 임시로 저장된 데이터이기 때문에 외부에서 접속했을 때는 보이지 않음(아직 커밋이 발생하지 않았기 때문에) 

 

 

-> 자바에 연동한 같은 DB에는 lee가 포함되어 있지 않다.! (외부에서 데이터를 보는 경우)

 

-- 사원 삭제

> DELETE FROM emp WHERE empno = 8888;

> DELETE FROM emp WHERE ename = 'choi';

더보기

 

-> EMPNO 8888이 삭제되었고, ENAME ‘choi’가 삭제되었다.

 

 

->자바에서는 그대로 똑같이 8888choi가 유지되어 있다.

 

> COMMIT;

더보기

 

-> COMMIT 후에 변경사항이 외부에서도(자바) 저장되었다. (lee 삽입, park과 choi 삭제)

-> 커밋을 하기 전에는 다른 유저에게는 변경사항이 보이지 않는다.

-> 데이터베이스에서의 이런 기능을 읽기 일관성이라고 한다.

 

3) ROLLBACK

 

-- 사원 삭제

> DELETE FROM emp WHERE ename = 'lee';

 

> ROLLBACK;

 

-> ROLLBACK을 했더니 전에 삭제된 lee가 다시 생성되었다.

-> 트랜잭션(커밋)후에 ROLLBACK을 하면 커밋 이후의 작업을 취소하고 다시 돌아간다.

 


2. SAVEPOINT와 ROLLBACK TO 

- SAVEPOINT: 부분적인 롤백을 가능하게 하기 위해 트랜잭션에 대한 중간점을 정의한다.

- 임의의 포인트에 작업을 SAVEPOINT로 저장하고 ROLLBACK TO로 다시 돌아간다.

 

<현재 emp 테이블> 

 

-- SAVEPOINT하고 레코드 추가

SAVEPOINT a;

> INSERT INTO emp(empno,ename) VALUES (2222, 'aaaaaa');

> INSERT INTO emp(empno,ename) VALUES UES (3333, 'bbbbb');

> SELECT * FROM emp;

 

SAVEPOINT b;

> DELETE FROM emp WHERE empno=1111;

> DELETE FROM emp WHERE job='salesman';

> SELECT * FROM emp;

 

SAVEPOINT c;

> UPDATE emp SET comm=5000;

> SELECT * FROM emp;

 

ROLLBACK TO c;

> SELECT * FROM emp;

더보기

 

-> SAVEPOINT c가 선언되기 전으로 돌아갔다(UPDATE emp SET comm=5000; 전으로)

 

ROLLBACK TO SAVEPOINT b;

> SELECT * FROM emp;

더보기

 

-> SAVEPOINT b가 선언되기 전으로 돌아갔다(DELETE FROM emp WHERE empno=1111; DELETE FROM emp WHERE job='salesman';전으로)

 

ROLLBACK TO a;

>SELECT * FROM emp;

더보기

 

 

-> SAVEPOINT a가 선언되기 전으로 돌아갔다