[Database] Transaction
# 트랜젝션
- DML를 하나로 묶어서 처리하는 논리적 작업 단위
- insert, update, delete, merge 작업이 해당된다.
- 트랜젝션 상태는 영구 반영이 되지 않은 상태로 commit, rollback등의 명령어로 완료 처리를 해야한다.
[예시] 트랜젝션이란
- 상단의 인서트문을 통해서 IT부서가 삽입되었고, 셀렉트문 조회 시 사진처럼 삽입된 결과가 보인다.
- 이를 작업 단위를 트랜젝션이라고 부른다.
- 화면 상에서만 수정된 결과가 보이지만 수정이 영구 반영되지 않은 상태이므로 commit으로 작업을 완료해야한다.

insert into dept values ('60', 'IT',606);
# TCL 명령어
명령어
|
설명
|
commit
|
트랜젝션 상태가 종료되며, DML 작업의 변경 내용을 영구히 저장
|
rollback
|
트랜젝션 상태가 종료되며, 진행한 DML작업을 트랜젝션 상태 전으로 복원
|
savepoint |
트랜젝션 상태에서 특정 부분만 커밋 혹은 롤백
|
(1) auto commit
- 트랜젝션 상태가 없어지며, 입력했던 DML 명령어가 바로 영구적용된다.
경우 | 오토커밋이 진행되는 상황 |
DCL 명령어 | grant, revoke등 DCL 명령어 수행 시 (DCL작업과 DML작업은 같은 곳에서 진행하지 않는다.) |
sqlplus에서 exit명령어 입력 | sqlplus에서 exit 명령어를 직접 입력하는 경우 그 이전에 작업한 transaction은 자동 커밋이 된다. |
(2) auto rollback
- 트랜젝션 상태가 없어지며, 입력했던 DML 명령어가 전부 초기화된다.
경우 | 오토롤백이 진행되는 상황 |
sqlplus가 강제로 종료 | 시스템이 비정상적으로 종료되는 경우 (상단의 x버튼이 클릭되거나 네트워크가 끊어진 경우) |
(3) savepoint
- 작업 중 특정 부분만 commit하고, 나머지 부분은 rollback 한다.
쿼리 |
명령어
|
설명
|
||
create table test(id, number);
|
1, 3의 데이터를 커밋 후 2만 롤백할 수는 없으며 2를 롤백하기위해선 1,3도 롤백해야한다.
|
|||
insert into test(id) values(1);
savepoint a;
insert into test(id) values(2); savepoint b; insert into test(id) values(3); |
rollback to a
|
데이터 1은 커밋, 나머지는 롤백
|
||
rollback to b
|
데이터 1,2 의 커밋, 나머지는 롤백
|
# Dead Lock
- 교착상태라고도 부르며 트랜젝션이 서로 꼬여있는 상태이다.
- 여러 인원이 하나의 테이블을 수정할 수 없도록 하기위해서 존재하는 기능이다.
(1) 유저 a가 dept 테이블에 DML 작업을 진행한 경우
- dept 테이블은 트랜젝션 상태가 된다.
- 이 상태에서는 유저 a가 TCL(커밋, 롤백) 명령어를 입력하기 전까지 수정 반영된 내용을 확인할 수 없다.
update dept
set dept_nm = 'test1'
where dept_no = 10
(2) 유저 b가 dept 테이블에 DML 작업을 진행한 경우
- (1) 이 트랜젝션 상태인 경우 유저 b가 같은 테이블에 DML 작업을 시도한 경우 교착 상태에 진입하게 된다.
- 교착 상태에서는 waiting 상태가 되어 어떤 반응도 없이 대기하는 상태가 되며
- 유저 a의 TCL (커밋, 롤백)등의 작업이 완료되어야만 선행된 트랜젝션이 반영 혹은 롤백된 후 b작업이 트랜젝션이 돌입하게 된다.
update dept
set dept_nm = 'test2'
where dept_no = 10
[예시] 교착 상태
(1) 유저 a의 dept 조회

(2) 유저 a의 update 진행
- 트랜젝션 상태 진입

(3) 유저 b의 dept 조회
- a 유저의 작업은 영구 적용되지 않았으므로 변경 사항의 조회가 불가능하다.

(4) 유저 b의 update 작업
- 유저 a의 작업으로 dept 테이블이 이미 트랜젝션 상태이므로 유저 b의 작업은 교착 상태에서 대기하게 된다.

(5) 유저 a의 rollback

(6) 유저 b의 작업 확인
- 유저 a의 롤백이 완료되었으므로 a의 트랜젝션 상태가 끝나고 그에따라서 b 작업이 트랜젝션 상태로 진입한다.
