본문 바로가기
  • 개발공부 및 일상적인 내용을 작성하는 블로그 입니다.
이론/데이터베이스

DB - 트랜잭션(Transaction)

by 방구석 대학생 2022. 1. 29.

 

트랜잭션

데이터베이스의 상태를 변화시키기 위해 수행하는 작업 단위이다.

여기서 상태를 변화시킨 다는 것은 SQL 질의어를 통해 DB 에 접근하는 것을 말한다.

- Select    - Insert    - Delete    - Update

 

또한 작업 단위는 많은 SQL 명령문들 중에서 개발자가 정하는 기준에 따라 정해진다.

예시) 사용자 A가 사용자 B에게 만원을 송금한다.

이때 DB 작업
1. 사용자 A의 계좌에서 만원을 차감한다 : update 문을 통해 사용자 A의 잔고를 변경
2. 사용자 B의 계좌에 만원을 추가한다 : update 문을 통해 사용자 B의 잔고를 변경

현재 작업 단위 : 출금 update 문 + 입금 update 문
- 이를 통틀어 하나의 트랜잭션 이라고 한다.
- 위 두 쿼리문 모두 성공적으로 완료되어야 만 "하나의 작업(트랜잭션)" 이 완료되는 것이다.(Commit)
- 작업 단위에 속하는 쿼리 중 하나라도 실패하면 모든 쿼리문을 취소하고 이전 상태로 돌려놓아야 한다.(Rollback)
- 사실상 제공하는 서비스 들 중에서 구현해놓은 하나하나의 기능 단위라고 생각하면 된다.

즉, 하나의 트랜잭션 설계를 잘 만드는 것이 데이터를 다룰 때 많은 이점을 가져다준다.

* commit : 하나의 트랜잭션이 성공적으로 끝났고, DB 가 일관성 있는 상태일 때 이를 알려주기 위해 사용하는 연산

* Rollback : 하나의 트랜잭션 처리가 비정상적으로 종료되어 트랜잭션 원자성이 깨진 경우

트랜잭션이 정상적으로 종료되지 않았을 때, last consistent state(현재 트랜잭션의 시작 상태) 로 rollback 할 수 있다.

(상황이 주어지면 DB 측면에서 어떻게 해결할 수 있을지 대답할 수 있어야 한다.)

 

트랜잭션 특징

* 원자성(Atomicity)

- 트랜잭션이 DB에 모두 반영되거나, 혹은 전혀 반영되지 않아야 된다.

 

* 일관성(Consistency)

- 트랜잭션의 작업 처리 결과는 항상 일관성 있어야 한다.

 

* 독립성(Isolation)

- 둘 이상의 트랜잭션이 동시에 병행 실행되고 있을 때, 어떤 트랜잭션도 다른 트랜잭션 연산에 끼어들 수 없다.

 

* 지속성(Durability)

- 트랜잭션이 성공적으로 완료되었으면, 결과는 영구적으로 반영되어야 한다.

 

 

트랜잭션 관리를 위한 DBMS 의 전략

이해를 위한 2가지 개념 : DBMS 의 구조 / Buffer 관리 정책

 

1. DBMS의 구조

크게 2가지로 나뉜다 : Query Processor(질의 처리기), Storage System(저장 시스템)

입출력 단위 : 고정 길이의 page 단위로 disk에 읽거나 쓴다.

저장 공간 : 비휘발성 저장 장치인 disk 에 저장, 일부분을 Main Memory 에 저장

 

2. Page Buffer Manager or Buffer Manager

DBMS의 Storage System 에 속하는 모듈 중 하나로, Main Memory 에 유지하는 페이지를 관리하는 모듈

- Buffer 관리 정책에 따라 Undo 복구와 Redo 복구가 요구되거나 그렇지 않게 되므로, 트랜잭션 관리에 매우 중요한 영향을 가져온다.

 

 

Undo, Redo

Redo 는 "다시 하다" 라는 뜻을 가지고 Undo 는 "원 상태로 돌리다" 라는 뜻을 가지고 있다.

즉, Redo 는 무언가를 다시 하는 것이고 Undo 는 무언가를 되돌리는 것이다.

 

Redo 는 기본적으로 복구의 역할을 한다. 오라클 서버에 무슨 작업을 하든지 모두 Redo 에 기록된다.(Undo 포함)

Undo 는 작업 롤백과 읽기 일관성, 복구를 한다.

Redo 와 Undo 의 공통점은 복구를 한다는 것이다.

 

하지만 둘의 복구 방법에는 차이가 있다.

Redo 는 복구를 할 때 사용자가 했던 작업을 그대로 다시 하지만, Undo 는 사용자가 했던 작업을 반대로 진행한다.

즉, 사용자의 작업을 원 상태로 되돌린다.(작업하기 이전으로)

 

예를 들어 아래와 같은 작업을 했을 때 세션이 비정상적으로 종료 되었다고 가정해보자.

update t1
set no = no + 1
where id = 1;

 세션이 복구되는 과정에서 아래의 작업을 다시 진행한다.(Redo)

update t1
set no = no + 1
where id = 1;

 

하지만 만일 세션이 비정상 종료가 되기 전 commit 을 하지 않았다면 Undo 를 이용하여 아래와 같은 작업을 이어서 하게 된다.(Undo)

update t1
set no = no - 1
where id = 1;

 

복구는 Undo 를 통해서 복구를 하게 된다. 즉, Rollback 을 한다는 의미이다.

시스템 장애가 발생하게 되면 Undo 데이터도 모두 날아간다. 결국 시스탬 장애시 Redo 데이터를 이용해서 마지막 Check point 부터 장애까지의 DB Buffer Cache 를 복구하게 된다.

이게 완료 되면 Undo 를 이용하여 commit 되지 않은 데이터를 모두 Rollback 함으로서 복구를 완료하게 된다.

결국 Redo 가 Undo 를 복구하고, 최종적으로 Undo 가 복구를 수행하게 된다.

 

참고로 Undo 데이터는 아래와 같이 기록된다

- INSERT 시, insert 된 컬럼의 rowid 기록

- UPDATE 시, 바뀐 컬럼의 바뀌기 전 값 기록

- DELETE 시, 지워진 모든 데이터 기록

 

 

 

참고 : https://gyoogle.dev/blog/

 

👨🏻‍💻 Tech Interview

 

gyoogle.dev

참고 : https://brownbears.tistory.com/181

 

[DB] 트랜잭션, REDO와 UNDO 개념

트랜잭션이란? 데이터베이스 트랜잭션(Database Transaction)은 데이터베이스 관리 시스템 또는 유사한 시스템에서 상호작용의 단위입니다. 여기서 유사한 시스템이란 트랜잭션이 성공과 실패가 분

brownbears.tistory.com

 

'이론 > 데이터베이스' 카테고리의 다른 글

DB - 정규화(Normalization)  (0) 2022.01.28
DB - 인덱스(Index)  (0) 2022.01.28
DB - 이상(Anomaly)  (0) 2022.01.28
DB - SQL vs NOSQL  (0) 2022.01.28
DB - Join  (0) 2022.01.28