트랜잭션
데이터베이스의 상태를 변화시키기 위해 수행하는 작업 단위이다.
여기서 상태를 변화시킨 다는 것은 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 |