데이터제어언어: 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: 자동커밋아님
> 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’가 삭제되었다.
->자바에서는 그대로 똑같이 8888과 choi가 유지되어 있다.
> 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가 선언되기 전으로 돌아갔다
'멀티캠퍼스 풀스택 과정 > 데이터베이스' 카테고리의 다른 글
데이터베이스3-2 테이블의 관리(ALTER) (0) | 2022.01.20 |
---|---|
데이터베이스3-1 테이블의 생성, 복사, 삭제 (0) | 2022.01.19 |
데이터베이스2-5 JDBC로 JAVA와 DB의 연동(DELETE문) (0) | 2022.01.19 |
데이터베이스2-4 JDBC로 JAVA와 DB의 연동(UPDATE문) (0) | 2022.01.19 |
데이터베이스2-3 JDBC로 JAVA와 DB의 연동(INSERT문) (0) | 2022.01.19 |