트랜잭션·회복·병행 제어
목차 18
트랜잭션은 DB 상태를 바꾸는 하나의 논리적 작업 단위이고, 그 안전을 떠받치는 세 기둥이 ACID·회복·병행 제어다. 3과목에서 거의 매 회차 ACID 정의·로킹 단위 트레이드오프·교착 4조건·회복 기법이 나오는 빈출 단원이다.
핵심 암기: ACID 4대 특성 원일고영(원자성·일관성·고립성=격리성·영속성) · 교착 4조건 상점비환(상호배제·점유와대기·비선점·환형대기) · 회복 두 동작 REDO/UNDO(COMMIT 발행 여부로 분별) · 로킹 단위 5종(DB·File·Relation·Page·Record·오버헤드↔병행성 반대) · 2단계 로킹 확장(획득만)+축소(해제만)
트랜잭션과 ACID
트랜잭션이란 ·트랜잭션·
[정의] 트랜잭션(Transaction) = 데이터베이스의 상태를 변환시키는 하나의 논리적 작업 단위. "한 번에 모두 실행되거나, 하나도 실행되지 않아야 하는 작업 묶음"이다.
대표 예 — 계좌 이체는 출금과 입금이 함께 성공하거나 함께 실패해야 한다. A만 출금되고 B에 입금이 안 되면 돈이 사라진다.
[표] 트랜잭션의 시작과 끝 (26강 COMMIT/ROLLBACK 회수).
| 시점 | 명령 | 의미 |
|---|---|---|
| 시작 | BEGIN(또는 START TRANSACTION) |
작업 단위 시작 |
| 성공 | COMMIT |
변경을 영구 저장(확정) |
| 실패 | ROLLBACK |
변경을 취소·원상 복구 |
🔑 암기 트랜잭션 = 논리적 작업 단위 = All or Nothing 묶음.
💡 보충 26강에서 본 COMMIT·ROLLBACK이 바로 트랜잭션을 확정·취소하는 명령이다. 이 강은 그 두 명령이 무엇을 보장하는지를 ACID로 풀어낸다.
ACID 4대 특성 — 원일고영 ·트랜잭션·
[정의] ACID = 트랜잭션이 반드시 지켜야 하는 4대 특성. 정처기에서 거의 매 회차 정의를 묻거나 틀린 설명을 고르게 한다.
[표] ★원일고영★ — 특성·의미·보장 메커니즘을 한 표로.
| 특성 | 영문 | 핵심 의미 | 보장 메커니즘 |
|---|---|---|---|
| 원자성 | Atomicity | All or Nothing(부분 실행 ❌) | COMMIT·ROLLBACK·회복 기법(UNDO) |
| 일관성 | Consistency | 실행 전후 무결성 제약 보존 | 무결성 제약·트리거(24강 PK/FK/CHECK·28강 정규화) |
| 고립성=격리성 | Isolation | 동시 실행 시 서로 간섭 차단 | 병행 제어(로킹·격리 수준·MVCC) |
| 영속성 | Durability | 완료된 결과는 영구 반영 | 로그·체크포인트·WAL |
- 일관성 — 이체 전 합계 80,000원이면 이체 후에도 80,000원. 28강 정규화로 건 제약과 24강 PK·FK·CHECK가 트랜잭션 후에도 그대로 유지돼야 한다.
- 영속성 — COMMIT한 뒤 시스템 장애가 나도 결과는 살아남는다. 로그에 먼저 적어 두기 때문이다.
🔑 암기 원·일·고·영 4글자에 매칭 안 되는 보기는 100% 함정. "원래 일관되게 고정 영속한다." ⚠️ 함정 ★1순위 — 격리성 ↔ 영속성 메커니즘 뒤바꿈★. "완료된 결과가 영구 반영"이라는 키워드가 보이면 무조건 영속성(격리성 ❌). 그 외 — "All or Nothing=일관성" ❌(→ 원자성) / "ROLLBACK이 일관성 보장" ❌(→ 원자성) / "DDL 자동 COMMIT으로 영속성이 약해진다" ❌(→ 오히려 영구 확정이라 강화·26강 회수). 🎯 빈출 ACID 중 하나의 설명을 고르거나 틀린 설명을 찾는 유형, "COMMIT/ROLLBACK이 보장하는 특성은"(→ 원자성)이 단골. 💡 보충 ACID는 1980년대 초 트랜잭션 연구자들이 정립했고, 두문자어 'ACID' 자체는 이후 정식 명명됐다. 정의가 변하지 않는 evergreen 개념이라 시험에도 표현이 거의 그대로 나온다.
트랜잭션 상태 전이 ·트랜잭션·
[정의] 트랜잭션은 생성부터 종료까지 여러 상태(State)를 거친다. "부분 완료"와 "완료"를 가르는 기준이 COMMIT이라는 점이 핵심이다.
정상 흐름
활동(Active) ─실행─> 부분 완료(Partially Committed) ─COMMIT─> 완료(Committed) ★영구 저장
실패 흐름
활동(Active) ─오류 발생─> 실패(Failed) ─ROLLBACK─> 철회(Aborted) ★원상 복구
[표] 5개 상태.
| 상태 | 설명 |
|---|---|
| 활동(Active) | 트랜잭션 실행 중 |
| 부분 완료(Partially Committed) | 마지막 연산까지 끝났으나 COMMIT 전 |
| 완료(Committed) | COMMIT 성공·영구 저장 완료 |
| 실패(Failed) | 오류로 실행 중단 |
| 철회(Aborted) | ROLLBACK 완료·원상 복구 |
🔑 암기 COMMIT 전 = 부분 완료 / COMMIT 후 = 완료. ⚠️ 함정 "부분 완료 = 영구 저장된 상태" ❌(→ 아직 COMMIT 전). 부분 완료에서 오류가 나면 실패→철회로 간다. 🎯 빈출 부분 완료와 완료의 구분, 철회(Aborted)가 ROLLBACK 결과라는 매칭.
회복 (Recovery)
회복과 장애 유형 ·회복·
[정의] 회복(Recovery) = 장애가 발생했을 때 DB를 장애 직전의 정상 상태로 복구하는 기법. 영속성·원자성을 실제로 떠받치는 장치다.
[표] 장애 3종.
| 장애 유형 | 원인 | 예시 |
|---|---|---|
| 트랜잭션 장애 | 트랜잭션 자체의 논리 오류 | 잘못된 입력·연산 오류 |
| 시스템 장애 | 하드웨어·소프트웨어 오류 | 전원 중단·OS 오류(메모리 내용 소실) |
| 미디어 장애 | 저장 장치 고장 | 디스크 헤드 손상(디스크 내용 소실) |
🔑 암기 장애 = 트랜잭션·시스템·미디어 3종. 🎯 빈출 장애 유형 분류보다, 회복의 두 동작(REDO/UNDO)과 회복 기법 종류가 더 자주 나온다.
REDO · UNDO ·회복·
[정의] 회복의 두 핵심 동작. 분별 1순위 기준은 "COMMIT 발행 여부" — 끝났으면 다시(REDO), 안 끝났으면 취소(UNDO)다.
[표] REDO vs UNDO.
| 구분 | REDO(재실행·전진 복구) | UNDO(취소·후진 복구) |
|---|---|---|
| 대상 | COMMIT 발행 O · DB 미반영 | COMMIT 발행 X(활동/실패에서 멈춤) |
| 동작 | 로그의 이후값으로 다시 기록 | 로그의 이전값으로 되돌리기 |
| 보장 | 영속성(Durability) | 원자성(Atomicity) |
- 로그 선행 기록(WAL, Write-Ahead Logging) — 데이터를 바꾸기 전에 로그를 디스크에 먼저 기록한다. 그래야 장애 시 로그만으로 복구가 가능하다.
- 로그 레코드 4요소 — 트랜잭션ID · 연산 · 이전값(Before Image) · 이후값(After Image).
🔑 암기 COMMIT O + 이후값 + 영속성 = REDO / COMMIT X + 이전값 + 원자성 = UNDO. ⚠️ 함정 "REDO는 이전값 사용" ❌(→ 이후값) / "UNDO는 COMMIT된 트랜잭션 대상" ❌(→ COMMIT 안 된) / "REDO가 원자성 보장" ❌(→ 영속성·원자성은 UNDO) / "ROLLBACK = REDO" ❌(→ ROLLBACK은 취소이므로 UNDO 쪽). 🎯 빈출 REDO/UNDO의 대상·동작·보장 특성을 서로 뒤바꿔 출제. 표 한 줄만 정확히 외우면 즉답.
회복 기법 4종 ·회복·
[정의] 회복 기법은 로그 기반(즉시 갱신·지연 갱신) + 체크포인트 + 그림자 페이지로 나뉜다. "로그를 필요로 하는 회복 기법"을 고르는 문제가 단골이다.
[표] 4종 비교.
| 기법 | 특징 | 로그 | 회복 동작 |
|---|---|---|---|
| 즉시 갱신(Immediate) | COMMIT 전에도 DB 즉시 변경 | ✅ 필요 | UNDO + REDO |
| 지연 갱신(Deferred) | COMMIT 후에만 DB 반영 | ✅ 필요 | REDO만(UNDO 불필요) |
| 체크포인트(Checkpoint) | 주기적 저장점 생성 | ✅ 필요 | 회복 범위 축소 |
| 그림자 페이지(Shadow Paging) | 페이지 테이블 사본 유지 | ❌ 불필요 | REDO/UNDO 둘 다 불필요 |
- 즉시 갱신 — COMMIT 전에도 변경하니 실패 시 되돌릴 UNDO가 필요하고, 그래서 로그가 반드시 있어야 한다.
- 지연 갱신 — COMMIT 전엔 로그에만 적고 DB는 안 건드리니 실패해도 되돌릴 게 없다(UNDO 불필요·REDO만).
- 체크포인트 — 일정 시점에 버퍼를 디스크에 강제 기록해 두면, 장애 시 그 지점 이후만 분석하면 된다.
- 그림자 페이지 — COMMIT 실패 시 사본(그림자) 페이지 테이블로 되돌리면 끝이라 로그가 필요 없다.
🔑 암기 "로그를 필요로 하는 회복 기법" = 즉시 갱신(대표) / "로그가 필요 없는 기법" = 그림자 페이지. ⚠️ 함정 "그림자 페이지는 로그가 필요하다" ❌ / "지연 갱신은 UNDO가 필요하다" ❌(→ REDO만) / "체크포인트는 회복 범위를 늘린다" ❌(→ 축소). 🎯 빈출 "로그를 필요로 하는 회복 기법은?"(→ 즉시 갱신), 보기에 대수적 코딩·폴딩·타임스탬프 같은 무관한 용어를 섞는다.
병행 제어 (Concurrency Control)
병행 제어와 직렬 가능성 ·병행 제어·
[정의] 병행 제어(Concurrency Control) = 여러 트랜잭션이 동시에 실행될 때 생기는 문제를 막아, 동시 실행 결과가 순차 실행한 것과 같아지도록 보장하는 기법.
[표] 목적과 기법.
| 구분 | 내용 |
|---|---|
| 목적 | ① 직렬 가능성(Serializability) 보장 ② 데이터 일관성 유지 ③ 시스템 효율 최대화 |
| 기법 | 로킹(Locking) · 타임스탬프 · 낙관적 검증 · 다중 버전(MVCC) |
- 직렬 가능성 — 여러 트랜잭션을 동시에 돌려도, 그 결과가 어떤 순차 실행 결과와 동등하면 올바른 병행 수행이다.
🔑 암기 병행 제어의 1번 목적 = 직렬 가능성 보장. 대표 기법 = 로킹. 💡 보충 격리성(ACID의 'I')을 실제로 구현하는 게 바로 이 병행 제어다. ACID와 따로 노는 개념이 아니다.
병행 수행의 3대 문제 ·병행 제어·
[정의] 병행 제어가 없을 때 생기는 세 가지 대표 문제. 이름과 현상의 매칭이 시험 포인트다.
[표] 3대 문제.
| 문제 | 다른 이름 | 현상 |
|---|---|---|
| 갱신 분실(Lost Update) | — | 같은 데이터를 동시에 수정 → 나중 값이 먼저 값을 덮어써 한쪽 수정이 사라짐 |
| 비완료 의존성 | Dirty Read | COMMIT 안 된(곧 ROLLBACK될) 데이터를 다른 트랜잭션이 읽음 |
| 불일치 분석 | Unrepeatable Read | 같은 데이터를 두 번 읽는데 중간에 다른 트랜잭션이 바꿔 결과가 달라짐 |
🔑 암기 덮어씀=갱신 분실 / 미완료 읽기=Dirty Read / 두 번 읽기 차이=Unrepeatable Read. ⚠️ 함정 "Dirty Read = 같은 데이터 두 번 읽기" ❌(→ 그건 Unrepeatable Read) / "갱신 분실 = COMMIT 전 데이터 읽기" ❌(→ 그건 Dirty Read). 🎯 빈출 현상을 주고 어떤 문제인지, 또는 "COMMIT되지 않은 데이터를 읽는 현상"(→ Dirty Read)을 직접 매칭.
로킹 — 공유 락 · 배타 락 ·병행 제어·
[정의] 로킹(Locking) = 트랜잭션이 데이터에 접근하기 전에 잠금(Lock)을 걸어 다른 트랜잭션의 접근을 제어하는 기법. 잠금에는 읽기용 공유 락, 읽기·쓰기용 배타 락이 있다.
[표] 두 잠금.
| 잠금 | 용도 | 동시 허용 |
|---|---|---|
| 공유 락(S-Lock, Shared) | 읽기(READ) | 여러 트랜잭션이 동시에 가능(읽기는 공유) |
| 배타 락(X-Lock, Exclusive) | 읽기·쓰기(READ+WRITE) | 단 하나의 트랜잭션만 |
[표] 잠금 호환 매트릭스 — S끼리만 공유, X는 독점.
| 보유 중 \ 요청 | S-Lock 요청 | X-Lock 요청 |
|---|---|---|
| S-Lock 보유 | ✅ 허용 | ❌ 대기 |
| X-Lock 보유 | ❌ 대기 | ❌ 대기 |
🔑 암기 S+S = 허용, 나머지(S+X·X+X) = 대기. "읽기는 공유, 쓰기는 독점." ⚠️ 함정 "X-Lock끼리 동시에 가능" ❌(→ 대기) / "S-Lock 상태에서 다른 트랜잭션이 X-Lock 가능" ❌(→ 대기). 🎯 빈출 호환 매트릭스 한 칸을 뒤집어 출제. 읽기 조회는 S락(동시 가능), 쓰기·차감은 X락(직렬화)이라는 매칭.
로킹 단위 5종 트레이드오프 ·병행 제어·
[정의] 로킹 단위(Locking Granularity) = 잠금을 거는 데이터의 크기 단위. 큰 것부터 DB · File · Relation · Page · Record 5종이다.
[큰 단위] DB → File → Relation → Page → Record [작은 단위]
[표] ★시험 1순위 — 오버헤드와 병행성은 항상 반대 방향★.
| 단위 | 락의 수 | 로킹 오버헤드 | 병행성(동시성) |
|---|---|---|---|
| 크면 | 적음 | 감소 ↓ | 감소 ↓ |
| 작으면 | 많음 | 증가 ↑ | 증가 ↑ |
- 대부분의 상용 DBMS는 레코드(행) 락을 기본으로 쓰고, 필요하면 페이지·테이블 락으로 승급(Lock Escalation)한다.
🔑 암기 단위 ↓ = 오버헤드 ↑ · 병행성 ↑ (오버헤드와 병행성은 항상 반대). ⚠️ 함정 "단위가 작을수록 오버헤드가 작다" ❌(→ 크다·병행성은 높다) / "단위가 클수록 동시성이 높아진다" ❌(→ 낮아진다·공유도 감소). 🎯 빈출 "로킹에 대한 설명으로 옳지 않은 것"에서 "단위가 커지면 공유도(병행성)가 증가한다"를 끼워 넣는 게 단골 오답.
교착 상태 — 상점비환 ·병행 제어·
[정의] 교착 상태(Deadlock) = 둘 이상의 트랜잭션이 서로 상대가 보유한 락을 기다리며 무한정 대기하는 상태. 로킹의 대표적 부작용이다.
T1: A에 X락 보유 ── B에 X락 요청 (대기)
T2: B에 X락 보유 ── A에 X락 요청 (대기)
서로 상대의 락을 기다림 → 순환 대기 → 영원히 멈춤
[표] ★상점비환★ — 4조건이 전부 만족해야 교착 발생(하나만 깨도 사라짐).
| 조건 | 영문 | 내용 |
|---|---|---|
| 상호 배제 | Mutual Exclusion | 자원을 한 번에 한 트랜잭션만 사용 |
| 점유와 대기 | Hold and Wait | 자원을 쥔 채 다른 자원을 또 기다림 |
| 비선점 | No Preemption | 락을 강제로 빼앗을 수 없음 |
| 환형 대기 | Circular Wait | 대기 관계가 원(T1→T2→…→T1)을 이룸 |
[표] 해결 4전략 — 예회탐복.
| 전략 | 내용 |
|---|---|
| 예방(Prevention) | 4조건 중 하나를 원천 차단(예: 자원에 순서를 매겨 환형 대기 차단) |
| 회피(Avoidance) | 안전 상태를 유지하도록 할당 — 은행원 알고리즘 |
| 탐지(Detection) | 발생을 허용하되 자원 할당 그래프로 주기적 탐지 |
| 복구(Recovery) | 탐지 후 트랜잭션 하나를 희생(ROLLBACK)시켜 해소 |
🔑 암기 4조건 = 상·점·비·환 / 해결 = 예·회·탐·복 / 은행원 알고리즘 = 회피. ⚠️ 함정 "선점(Preemption)이 교착 조건" ❌(→ 4조건은 비선점·선점 허용은 깨는 방법) / "교착 해결법은 5가지" ❌(→ 예회탐복 4가지) / "은행원 알고리즘 = 예방" ❌(→ 회피). 🎯 빈출 4조건이 아닌 것 고르기(가짜 보기=선점), 은행원 알고리즘의 분류(→ 회피). 운영체제 교착 4조건과 완전히 같아 4과목에서도 회수된다(은행원 알고리즘 자체는 35강 본격).
2단계 로킹 프로토콜 (2PL) ·병행 제어·
[정의] 2단계 로킹(2PL, Two-Phase Locking) = 트랜잭션의 락 운영을 확장 단계와 수축 단계 둘로 분리하는 규칙. 직렬 가능성을 보장하지만 교착 상태는 여전히 생길 수 있다.
[표] 두 단계.
| 단계 | 이름 | 허용 작업 |
|---|---|---|
| 1단계 | 확장(Growing) | 락 획득만 가능(해제 ❌) |
| 2단계 | 수축(Shrinking) | 락 해제만 가능(획득 ❌) |
[확장] [수축]
Lock A → Lock B ──정점──> Unlock A → Unlock B
(획득만) (해제만)
- 두 단계의 전환점 = 락 정점(Lock Point). 변형으로 모든 배타 락을 트랜잭션 종료 시 한꺼번에 푸는 엄격 2PL(Strict 2PL)이 있다(연쇄 복귀 차단).
🔑 암기 2PL = 확장(획득만) + 수축(해제만) → 직렬 가능성 보장 · 교착은 여전히 가능. ⚠️ 함정 "확장 단계에서 락 해제" ❌(→ 수축) / "2PL이 교착 상태를 방지한다" ❌(→ 직렬 가능성만 보장·교착은 별개) / "2PL = 격리 수준 2단계" ❌(→ 격리 수준은 4단계로 별개 개념). 🎯 빈출 2PL이 보장하는 것(→ 직렬 가능성)과 보장하지 못하는 것(→ 교착 방지)을 가르는 문제.
타임스탬프 기법 ·병행 제어·
[정의] 타임스탬프(Timestamp) 기법 = 각 트랜잭션에 고유한 시작 시각(타임스탬프)을 부여하고, 그 순서대로 직렬화하는 병행 제어. 잠금을 쓰지 않는다.
[표] 로킹 vs 타임스탬프.
| 구분 | 로킹(Locking) | 타임스탬프(Timestamp) |
|---|---|---|
| 잠금 | 사용 | 사용 안 함 |
| 교착 상태 | 발생 가능 | 발생 안 함 |
| 충돌 해결 | 대기 | ROLLBACK(순서 위반 시 되돌림) |
| 구현 복잡도 | 낮음 | 높음 |
🔑 암기 타임스탬프 = 잠금 없음 = 교착 없음 = 충돌은 ROLLBACK으로 해결. ⚠️ 함정 "타임스탬프는 교착 상태가 발생한다" ❌(→ 핵심 장점이 교착 없음) / "타임스탬프는 잠금을 사용한다" ❌(→ 사용 안 함) / "로킹보다 구현이 간단하다" ❌(→ 복잡). 🌟 합격 한 끗 타임스탬프는 "교착 없음 · 잠금 없음 · ROLLBACK 충돌 해결" 세 가지만 잡으면 충분. 기아 상태(Starvation)가 생길 수 있다는 정도까지.
기출 다지기
[기출 1 출제] Commit과 Rollback 명령어에 의해 보장받는 트랜잭션의 특성은? (ACID 특성)
- ① 병행성
- ② 보안성
- ③ 원자성
- ④ 로그
정답 및 해설 보기
정답 ③
COMMIT(전부 확정)·ROLLBACK(전부 취소)은 "모두 실행되거나 모두 실행되지 않음"을 보장 → 원자성(Atomicity).
| 보기 | 판정 | 이유 |
|---|---|---|
| ① 병행성 | ❌ | 병행 제어(로킹) 영역 |
| ② 보안성 | ❌ | ACID 특성 아님 |
| ③ 원자성 | ✅ | COMMIT/ROLLBACK = All or Nothing → 정답 |
| ④ 로그 | ❌ | 회복 기법의 수단일 뿐 |
🔑 암기 COMMIT/ROLLBACK = 원자성.
[기출 2 출제] 트랜잭션의 특성 중 완료된 연산 결과가 시스템에 영구 반영된다는 의미의 특성은? (ACID 특성)
- ① 원자성(Atomicity)
- ② 일관성(Consistency)
- ③ 격리성(Isolation)
- ④ 영속성(Durability)
정답 및 해설 보기
정답 ④
"완료된 연산 결과가 시스템에 영구 반영" = 영속성(Durability). 이 문장이 거의 그대로 출제된다.
| 보기 | 판정 | 핵심 |
|---|---|---|
| ① 원자성 | ❌ | All or Nothing |
| ② 일관성 | ❌ | 무결성 제약 유지 |
| ③ 격리성 | ❌ | 다른 트랜잭션 간섭 차단 |
| ④ 영속성 | ✅ | COMMIT 후 영구 저장 → 정답 |
🔑 암기 "영구 반영" 키워드 = 영속성(격리성과 뒤바꿈 함정 주의).
[기출 3 출제] 병행 제어 기법 중 로킹(Locking)에 대한 설명으로 옳지 않은 것은? (로킹 단위)
- ① 로킹의 대상이 되는 객체의 크기를 로킹 단위라고 한다.
- ② 데이터베이스, 파일, 레코드 등은 로킹 단위가 될 수 있다.
- ③ 로킹 단위가 작아지면 로킹 오버헤드가 증가한다.
- ④ 로킹 단위가 커지면 데이터베이스 공유도(병행성)가 증가한다.
정답 및 해설 보기
정답 ④
로킹 단위가 커지면 공유도(병행성)는 감소한다(오버헤드만 감소). 방향이 정반대라 틀린 설명.
| 보기 | 판정 | 이유 |
|---|---|---|
| ① | ✅ | 로킹 단위 = 잠금 대상 객체 크기 |
| ② | ✅ | DB·파일·레코드 모두 로킹 단위 가능 |
| ③ | ✅ | 단위 작으면 락 수↑ → 오버헤드 증가 |
| ④ | ❌ | 단위 커지면 공유도 감소 → 정답(틀림) |
🔑 암기 단위 ↑ = 오버헤드 ↓ · 병행성 ↓ (항상 반대).
[기출 4 출제] 데이터베이스 로그(log)를 필요로 하는 회복 기법은? (회복 기법)
- ① 즉각 갱신 기법
- ② 대수적 코딩 방법
- ③ 타임 스탬프 기법
- ④ 폴딩 기법
정답 및 해설 보기
정답 ①
즉시(즉각) 갱신 기법은 COMMIT 전에도 DB를 바꾸므로 UNDO를 위한 로그가 반드시 필요하다.
| 보기 | 판정 | 이유 |
|---|---|---|
| ① 즉각 갱신 | ✅ | 로그 필요(UNDO용) → 정답 |
| ② 대수적 코딩 | ❌ | 회복 기법 아님 |
| ③ 타임 스탬프 | ❌ | 병행 제어 기법 |
| ④ 폴딩 | ❌ | 해싱 관련 |
🔑 암기 "로그 필요 회복" = 즉시 갱신 / "로그 불필요" = 그림자 페이지.
[기출 5 출제] 교착 상태(Deadlock)의 해결 방법 중 은행원 알고리즘(Banker's Algorithm)이 해당하는 것은? (교착 해결)
- ① 교착 상태 예방(Prevention)
- ② 교착 상태 회피(Avoidance)
- ③ 교착 상태 탐지(Detection)
- ④ 교착 상태 복구(Recovery)
정답 및 해설 보기
정답 ②
은행원 알고리즘은 항상 안전 상태를 유지하도록 자원을 할당해 교착을 미리 피한다 → 회피(Avoidance).
| 전략 | 핵심 |
|---|---|
| 예방 | 4조건 중 하나 원천 차단 |
| 회피 | 안전 상태 유지(은행원 알고리즘) → 정답 |
| 탐지 | 발생 허용 후 그래프로 탐지 |
| 복구 | 탐지 후 트랜잭션 희생 |
🔑 암기 은행원 = 회피 / 해결 4전략 = 예회탐복.
[기출 6 출제] 병행 제어 기법에서 타임스탬프(Timestamp) 기법에 대한 설명으로 옳은 것은? (타임스탬프)
- ① 교착 상태가 발생할 수 있다.
- ② 트랜잭션 간의 충돌은 ROLLBACK 방식으로 해결한다.
- ③ 잠금(Lock)을 사용하여 직렬 가능성을 보장한다.
- ④ 로킹 기법보다 구현이 간단하다.
정답 및 해설 보기
정답 ②
타임스탬프는 순서 위반(충돌) 시 해당 트랜잭션을 ROLLBACK으로 되돌려 해결한다.
| 보기 | 판정 | 이유 |
|---|---|---|
| ① | ❌ | 타임스탬프는 교착 발생 안 함(핵심 장점) |
| ② | ✅ | 충돌을 ROLLBACK으로 해결 → 정답 |
| ③ | ❌ | 잠금을 사용 안 함 |
| ④ | ❌ | 로킹보다 구현 복잡 |
🔑 암기 타임스탬프 = 잠금 없음 · 교착 없음 · 충돌은 ROLLBACK.
[기출 7 출제] 교착 상태(Deadlock)의 발생 조건(4가지)에 해당하지 않는 것은? (교착 4조건)
- ① 상호 배제(Mutual Exclusion)
- ② 점유와 대기(Hold and Wait)
- ③ 선점(Preemption)
- ④ 환형 대기(Circular Wait)
정답 및 해설 보기
정답 ③
교착 4조건은 상호 배제·점유와 대기·비선점·환형 대기다. 선점은 오히려 교착을 깨는 방법이므로 조건이 아니다.
| 보기 | 판정 | 이유 |
|---|---|---|
| ① 상호 배제 | ✅ | 4조건 |
| ② 점유와 대기 | ✅ | 4조건 |
| ③ 선점 | ❌ | 4조건은 비선점 → 정답(틀림) |
| ④ 환형 대기 | ✅ | 4조건 |
🔑 암기 상·점·비·환 — '비'선점이지 선점이 아니다.
[기출 8 출제] COMMIT되지 않은 데이터를 다른 트랜잭션이 읽음으로써 발생하는 병행 수행의 문제는? (병행 수행 문제)
- ① 갱신 분실(Lost Update)
- ② 비완료 의존성(Dirty Read)
- ③ 불일치 분석(Unrepeatable Read)
- ④ 직렬 가능성(Serializability)
정답 및 해설 보기
정답 ②
미완료(곧 ROLLBACK될 수 있는) 데이터를 읽는 현상 = 비완료 의존성(Dirty Read).
| 보기 | 판정 | 이유 |
|---|---|---|
| ① 갱신 분실 | ❌ | 동시 수정으로 한쪽 값이 덮어써짐 |
| ② 비완료 의존성 | ✅ | COMMIT 전 데이터 읽기 → 정답 |
| ③ 불일치 분석 | ❌ | 같은 데이터 두 번 읽어 결과가 다름 |
| ④ 직렬 가능성 | ❌ | 병행 제어의 목적(문제 아님) |
🔑 암기 미완료 읽기 = Dirty Read / 두 번 읽기 차이 = Unrepeatable Read.
한 장 요약
ACID 4대 특성 — 원일고영
| 원자성 | 일관성 | 고립성(격리성) | 영속성 |
|---|---|---|---|
| Atomicity | Consistency | Isolation | Durability |
| All or Nothing | 무결성 제약 유지 | 간섭 차단 | 영구 반영 |
| COMMIT·ROLLBACK·회복 | 무결성 제약·트리거 | 병행 제어(로킹·MVCC) | 로그·체크포인트·WAL |
- 1순위 함정 — "영구 반영" 키워드 = 영속성(격리성과 뒤바꿈 주의)
회복 — REDO / UNDO (분별 기준 = COMMIT 발행 여부)
- REDO — COMMIT O · 이후값 · 영속성 보장
- UNDO — COMMIT X · 이전값 · 원자성 보장
- 회복 기법 4종 — 즉시 갱신(로그✅·UNDO+REDO) / 지연 갱신(로그✅·REDO만) / 체크포인트(범위 축소) / 그림자 페이지(로그❌·둘 다 불필요)
병행 수행 3대 문제 — 갱신 분실 / 비완료 의존성(Dirty Read) / 불일치 분석(Unrepeatable Read)
로킹
- S락(읽기·공유) / X락(쓰기·독점) — 호환은 S+S만 허용
- 로킹 단위 5종 — DB · File · Relation · Page · Record (단위 ↓ = 오버헤드 ↑ · 병행성 ↑, 항상 반대)
교착 상태 — 상점비환 / 해결 예회탐복
- 4조건 — 상호 배제 · 점유와 대기 · 비선점 · 환형 대기 (전부 만족해야 발생)
- 해결 — 예방 · 회피(은행원 알고리즘) · 탐지 · 복구
기타 병행 제어
- 2PL — 확장(획득만) + 수축(해제만) → 직렬 가능성 보장 · 교착은 여전히 가능
- 타임스탬프 — 잠금 없음 · 교착 없음 · 충돌은 ROLLBACK으로 해결
