Rdbms/Database

[Database] Transaction

hikr90 2025. 1. 10. 00:05

# 트랜젝션

- 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 작업이 트랜젝션 상태로 진입한다.