트랜잭션·로킹·회복 기법 판단법
ACID, 동시성 이상, 2단계 로킹과 로그 회복을 하나의 실행 흐름으로 연결합니다.
ACID와 동시성 이상
원자성은 전부 수행하거나 전부 취소하는 성질, 일관성은 트랜잭션 전후 제약조건 유지, 고립성은 동시 실행 결과가 직렬 실행처럼 보이는 성질, 지속성은 커밋 결과의 영구 보존을 뜻합니다.
- 갱신 분실은 두 트랜잭션의 변경 중 하나가 덮이는 현상이다.
- 오손 읽기는 커밋되지 않은 값을 읽는 현상이다.
- 반복 불가능 읽기와 팬텀 읽기는 같은 행의 값 변화와 조건 범위의 행 집합 변화를 구분한다.
로킹과 직렬 가능성
공유 잠금은 읽기, 배타 잠금은 쓰기에 사용합니다. 2단계 로킹은 잠금을 얻는 확장 단계와 잠금을 해제하는 축소 단계를 겹치지 않게 해 충돌 직렬 가능성을 보장합니다.
- 로킹 단위를 크게 하면 관리 비용은 줄지만 동시성도 줄어든다.
- 교착상태는 대기 그래프 탐지나 타임아웃 등으로 처리한다.
- 엄격한 2단계 로킹은 커밋·롤백까지 배타 잠금을 유지해 연쇄 복귀를 줄인다.
로그와 회복
WAL은 데이터 페이지보다 관련 로그를 먼저 안정 저장장치에 기록하는 원칙입니다. 즉시 갱신은 커밋 전 변경이 디스크에 반영될 수 있어 REDO와 UNDO를 모두 고려하고, 지연 갱신은 커밋 후 반영하므로 주로 REDO가 필요합니다.
- 체크포인트는 회복 시 확인할 로그 범위를 줄인다.
- UNDO는 미완료 트랜잭션의 변경을 되돌린다.
- REDO는 커밋된 변경이 빠졌을 때 다시 적용한다.
동시성 이상과 격리 수준을 연결하기
트랜잭션 문제는 두 실행 흐름을 시간순으로 나란히 적어 아직 커밋되지 않은 값을 읽었는지, 같은 조건을 다시 조회했을 때 결과가 달라졌는지 확인합니다. 잠금 범위와 유지 시간이 커질수록 일관성은 높아질 수 있지만 동시성은 낮아집니다.
- Dirty Read는 미커밋 값, Non-repeatable Read는 같은 행 값의 변화, Phantom Read는 조건 결과 행 집합의 변화다.
- 2단계 잠금은 확장 단계에서 획득하고 축소 단계에서 해제한다.
- 교착상태 탐지 시 대기 그래프의 사이클과 희생 트랜잭션 선택을 확인한다.
격리 수준·MVCC·인덱스 동시성
격리 수준이 높아질수록 허용되는 동시성 이상은 줄지만 잠금 대기나 버전 관리 비용이 커질 수 있습니다. MVCC는 여러 버전의 행을 이용해 읽기와 쓰기의 충돌을 줄이지만, 구현별 스냅샷 시점과 갱신 충돌 규칙은 다를 수 있습니다.
- READ UNCOMMITTED는 오손 읽기를 허용할 수 있고 READ COMMITTED는 이를 막는다.
- REPEATABLE READ는 같은 행의 반복 읽기를 보호하지만 팬텀 처리 방식은 DBMS 구현을 확인해야 한다.
- SERIALIZABLE은 직렬 실행과 같은 결과를 목표로 하며 재시도 가능한 직렬화 실패가 발생할 수 있다.
- 인덱스 범위 잠금이나 predicate locking은 조건 범위에 새 행이 들어오는 팬텀을 막는 데 사용될 수 있다.
개념 비교
| 항목 | 커밋 전 데이터 반영 | 회복 핵심 | 출제 포인트 |
|---|---|---|---|
| 즉시 갱신 | 가능 | UNDO + REDO | WAL 준수 |
| 지연 갱신 | 하지 않음 | REDO 중심 | 커밋 후 데이터 반영 |
| 검사점 | 방식과 무관 | 탐색 범위 축소 | 로그 전체를 처음부터 읽지 않음 |
지문 표현을 판단 기준으로 바꾸기
- 잠금 획득 후 해제, 다시 획득하지 않음 → 2단계 로킹
- 로그를 데이터보다 먼저 기록 → WAL
- 커밋하지 않은 값 읽기 → 오손 읽기
직접 풀어보는 예제와 단계별 해설
ACID 이름을 외우는 것과 실행 결과를 판단하는 것은 다릅니다. 아래 자체 예제에서는 먼저 읽은 값, 마지막으로 쓴 값, 디스크에 남은 값을 따로 추적합니다.
서로 다른 항목을 갱신해도 충돌 사이클이 생길까?
초깃값은 X=4, Y=9입니다. T1은 X를 읽어 Y=X+2를 쓰고, T2는 Y를 읽어 X=Y×2를 씁니다. 아래 읽기·쓰기는 표 순서대로 완료되며, 읽은 값은 각 트랜잭션 안에 보관합니다. 두 트랜잭션은 끝에 커밋합니다. 잠금으로 이 실행을 막지는 않는다고 가정하고 최종값과 충돌 직렬 가능성을 판단하세요.
넓은 표는 좌우로 밀어 나머지 열을 볼 수 있습니다.
| 순서 | 동작 | 관찰 결과 |
|---|---|---|
| 1 | T1: X 읽기 | T1이 4를 보관 |
| 2 | T2: Y 읽기 | T2가 9를 보관 |
| 3 | T1: Y 쓰기 | Y=4+2=6 |
| 4 | T2: X 쓰기 | X=9×2=18 |
| 실행 | 최종 X | 최종 Y |
|---|---|---|
| 위 교차 실행 | 18 | 6 |
| T1 다음 T2 | 12 | 6 |
| T2 다음 T1 | 18 | 20 |
풀이 순서
- X에서는 T1의 읽기가 T2의 쓰기보다 먼저이므로 T1→T2가 생깁니다. Y에서는 T2의 읽기가 T1의 쓰기보다 먼저이므로 T2→T1이 생깁니다. 서로 다른 트랜잭션이 같은 항목에 접근하고 하나 이상이 쓰기일 때 충돌입니다.
- 두 방향의 간선이 사이클을 이루므로 이 스케줄은 충돌 직렬 가능하지 않습니다. 이 수치에서도 결과 (18, 6)는 어느 직렬 순서의 결과와도 같지 않습니다.
- 두 트랜잭션이 다른 항목을 쓰므로 같은 행을 덮어쓰는 갱신 분실 예제는 아닙니다. 읽기와 쓰기 사이의 의존성까지 확인해야 합니다. 선행 그래프의 사이클은 직렬 가능성 판정이고, 잠금 대기 그래프의 사이클로 판단하는 교착상태와도 구분합니다.
틀리기 쉬운 지점: 최종 수치가 우연히 같다는 사실만으로 충돌 직렬 가능성을 증명할 수는 없습니다. 판정에는 읽기·쓰기 순서로 만든 그래프가 필요합니다.
커밋했는데 REDO, 디스크에 있는데 UNDO가 필요한 이유
X=40, Y=70에서 시작합니다. 아래 로그는 장애 전에 모두 안정 저장장치에 기록됐습니다. T1의 COMMIT 뒤에도 X 페이지는 디스크에 쓰이지 않았고, 미커밋 T2의 Y 페이지는 먼저 디스크에 쓰였습니다. 장애 직후 디스크 값은 X=40, Y=62입니다. 커밋한 변경만 남기는 단순 회복 모델에서 복구할 값을 구하세요. T1과 T2는 서로 다른 항목을 변경합니다.
넓은 표는 좌우로 밀어 나머지 열을 볼 수 있습니다.
| 순서 | 로그 | 의미 |
|---|---|---|
| 1 | START T1 | T1 시작 |
| 2 | T1: X, 40 → 55 | X의 이전 값과 이후 값 |
| 3 | COMMIT T1 | T1 커밋 확인 |
| 4 | START T2 | T2 시작 |
| 5 | T2: Y, 70 → 62 | 이후 COMMIT 없이 장애 |
| 대상 | 조치 | 복구 값 |
|---|---|---|
| T1의 X | REDO | 55 |
| T2의 Y | UNDO | 70 |
| 정책 | 허용되는 상황 | 필요해질 수 있는 처리 |
|---|---|---|
| STEAL | 미커밋 변경을 디스크에 기록 | UNDO |
| NO-FORCE | 커밋 때 모든 데이터 페이지를 강제 기록하지 않음 | REDO |
풀이 순서
- COMMIT T1은 영속 로그에 있지만 디스크 X=40에는 변경이 빠져 있으므로 이후 값 55를 재적용합니다. 커밋했다는 것과 데이터 페이지가 이미 디스크에 기록됐다는 것은 다릅니다.
- T2의 커밋 기록은 없는데 디스크 Y=62에는 미완료 변경이 남았습니다. 이전 값 70으로 되돌려 원자성을 회복합니다. 최종값은 X=55, Y=70입니다.
- WAL은 변경된 데이터 페이지보다 해당 로그를 먼저 영속화하는 원칙입니다. 로그가 있기 때문에 두 경우를 복구할 수 있는 것이지 WAL 자체가 모든 데이터 페이지의 즉시 기록을 뜻하지는 않습니다.
- 여기서는 최종적으로 필요한 효과만 비교했습니다. ARIES처럼 미완료 트랜잭션의 변경도 먼저 REDO한 뒤 UNDO하는 회복 알고리즘까지 이 표의 처리 순서로 일반화하면 안 됩니다.
틀리기 쉬운 지점: 즉시 갱신이라는 이름만 보고 언제나 같은 회복 절차라고 단정하지 마세요. 미커밋 페이지 기록 허용 여부와 커밋 시 강제 기록 여부, 실제 디스크 상태를 함께 확인합니다.
검증 방법과 참고 문서
자체 설계한 실행 순서에서 충돌 간선을 별도로 생성하고 두 직렬 실행 결과와 대조했습니다. 회복 예제는 로그와 디스크 상태를 분리한 계산 모델로 확인했습니다. 특정 DBMS에서 장애를 일으킨 실험이나 실제 운영 기록은 아닙니다.
예제·데이터·풀이표: 정처LAB 자체 설계 · AI 보조 작성 및 로컬 검증 · 예제 수정일 2026-09-27
혼동하기 쉬운 지점
- 원자성과 지속성을 같은 의미로 판단
- 로킹 단위가 작을수록 관리 비용도 작다고 판단
- 즉시 갱신과 지연 갱신의 UNDO·REDO 필요성을 반대로 기억