트랜잭션과 회복 기법
요약
데이터베이스 트랜잭션의 ACID 특성(원자성, 일관성, 고립성, 지속성)과 다양한 데이터베이스 회복 기법(로그 기반, 체크포인트, 그림자 페이징)을 표로 요약하고 실기 시험 문제를 풀어봅니다.
| 용어 | 키워드 |
|---|---|
| 원자성(Atomicity) | All or Nothing, 모두 실행되거나 하나도 실행되지 않음 |
| 일관성(Consistency) | 데이터베이스 일관된 상태 유지, 실행 후에도 일관성 보장 |
| 고립성(Isolation) | 다른 트랜잭션 끼어들 수 없음, 동시 실행 제어 |
| 지속성(Durability) | 영구적 저장, 성공 완료된 결과 보장 |
| REDO | 재실행, 성공 완료된 트랜잭션의 변경 내용 다시 적용 |
| UNDO | 취소, 실패한 트랜잭션의 변경 내용 원래 상태로 복구 |
| Locking | 직렬화 기법, 데이터 항목 잠금, 동시 접근 제어 |
트랜잭션의 특성: ACID
트랜잭션은 데이터베이스의 무결성과 일관성을 보장하기 위해 다음과 같은 네 가지 주요 특성(ACID)을 만족해야 합니다.
| 특성 (Property) | 설명 (Description) |
|---|---|
| 원자성 (Atomicity) | 트랜잭션의 연산은 모두 정상적으로 실행되거나 하나도 실행되지 않아야 합니다 (All or Nothing). |
| 일관성 (Consistency) | 트랜잭션 실행 후에도 데이터베이스는 항상 일관된 상태를 유지해야 합니다. |
| 고립성 (Isolation) | 하나의 트랜잭션이 실행 중일 때 다른 트랜잭션이 끼어들 수 없습니다. |
| 지속성 (Durability) | 성공적으로 완료된 트랜잭션의 결과는 영구적으로 데이터베이스에 저장되어야 합니다. |
데이터베이스 회복 기법
데이터베이스에 장애가 발생했을 때 데이터를 이전의 일관된 상태로 복구하기 위한 기법들입니다.
회복 기법의 핵심 요소
| 요소 (Component) | 설명 (Description) |
|---|---|
| REDO (재실행) | 트랜잭션이 성공적으로 완료(COMMIT)되었지만, 변경 내용이 디스크에 반영되지 않았을 경우 해당 내용을 다시 적용합니다. 트랜잭션 시작(Start)과 완료(Commit)에 대한 기록이 있는 경우 |
| UNDO (취소) | 트랜잭션이 실패(FAILED)했을 때, 변경 이전의 원래 상태로 되돌립니다. 트랜잭션 기록에 시작(Start) 있지만, 완료(Commit) 없는 경우 |
회복 기법의 종류
로그 기반 회복 (Log-based Recovery)
데이터베이스의 변경 사항을 로그 파일에 순차적으로 기록하고, 장애 발생 시 이 로그를 이용해 복구하는 기법입니다.
-
지연 갱신 (Deferred Update)
트랜잭션이 성공적으로 완료될 때까지 데이터베이스에 대한 변경을 지연시킵니다. UNDO가 필요 없으며 REDO만 사용합니다.
-
즉각 갱신 (Immediate Update)
트랜잭션 수행 중 발생하는 변경 사항을 즉시 데이터베이스에 반영합니다. REDO와 UNDO가 모두 필요할 수 있습니다.
체크포인트 회복 (Checkpoint Recovery)
특정 시점(체크포인트)에 데이터베이스의 일관된 상태를 저장하고, 장애 발생 시 가장 최근의 체크포인트에서부터 회복을 시작하여 복구 시간을 단축하는 기법입니다.
그림자 페이징 (Shadow Paging)
그림자 페이징은 현재 페이지 테이블과 그림자 페이지 테이블 두 개의 페이지 테이블1을 사용하는 기법입니다. 트랜잭션을 시작하면 그림자 페이지 테이블을 현재 페이지 테이블의 복사본으로 만들어 두며, 이 시점에는 두 테이블 모두 변경 전 원본 페이지를 가리킵니다. 변경이 일어나면 원본 페이지를 직접 고치지 않고 새 페이지를 만들어 변경 내용을 기록한 뒤, 현재 페이지 테이블이 그 새 페이지를 가리키도록 갱신합니다(예: 3번 페이지를 수정할 때 3번 페이지 자체를 건드리지 않고 새 페이지에 수정값을 쓴 뒤 현재 페이지 테이블만 새 페이지를 가리키게 바꿉니다). 이때 그림자 페이지 테이블은 트랜잭션 내내 변경 전 원본 페이지를 가리킨 채로 남습니다. 변경 전 원본을 그림자처럼 그대로 보존한다고 해서 '그림자' 페이지 테이블이라 부릅니다. 트랜잭션이 성공하면 현재 페이지 테이블을 확정 상태로 삼고 그림자 페이지 테이블은 버립니다. 실패하면 새 페이지를 가리키던 현재 페이지 테이블을 버리고 그림자 페이지 테이블을 다시 정식 테이블로 쓰면 됩니다(원본은 한 번도 수정되지 않았으므로 이미 복구 완료). 즉, 실패 시 변경 내용을 하나하나 되돌리는 별도의 취소(UNDO) 작업 없이 변경 전 상태로 복구됩니다.

트랜잭션 동시성 제어
여러 트랜잭션이 동시에 실행될 때 데이터베이스의 일관성을 유지하기 위한 기법입니다.
Locking (로킹)
| 개념 (Concept) | 설명 (Description) |
|---|---|
| Locking (로킹) | 트랜잭션이 데이터 항목에 접근할 때 해당 항목을 잠그는 기법으로, 다른 트랜잭션의 동시 접근을 제어하여 데이터의 일관성을 보장합니다. |
| 공유 락 (Shared Lock, S-Lock) | 데이터를 읽을 때 사용하는 락으로, 여러 트랜잭션이 동시에 같은 데이터를 읽을 수 있지만, 쓰기는 불가능합니다. |
| 배타 락 (Exclusive Lock, X-Lock) | 데이터를 쓸 때 사용하는 락으로, 해당 트랜잭션만이 데이터에 접근할 수 있으며, 다른 트랜잭션은 읽기/쓰기 모두 불가능합니다. |
| 2단계 락킹 (2-Phase Locking) | 트랜잭션의 락 획득과 해제를 두 단계로 나누어 직렬화를 보장하는 프로토콜입니다. 확장 단계(락 획득만)와 수축 단계(락 해제만)로 구성됩니다. |
트랜잭션 제어 명령어 (TCL)
TCL(Transaction Control Language)은 트랜잭션의 시작·종료·취소를 사용자가 명시적으로 제어하는 SQL 명령어입니다.
| 명령어 | 역할 |
|---|---|
| COMMIT | 트랜잭션의 변경 내용을 영구적으로 데이터베이스에 저장합니다. |
| ROLLBACK | 트랜잭션의 변경 내용을 취소하고 트랜잭션이 시작되기 이전 상태로 데이터베이스를 복구합니다. |
| SAVEPOINT | 트랜잭션 내 특정 지점을 저장해, 그 지점까지만 부분적으로 ROLLBACK 할 수 있게 해 줍니다. |
정보처리기사 실기 문제
Footnotes
-
페이지는 DB가 데이터를 저장하는 일정 크기의 단위(데이터 묶음)입니다. 페이지 테이블은 몇 번 페이지가 디스크 어디에 저장돼 있는지 적어둔 표(주소록 같은 것)입니다. ↩