트랜잭션과 동시성 제어
쉽게 말하면
트랜잭션은 '모두 되거나, 하나도 안 되거나' 해야 하는 작업 묶음이에요. 계좌 이체에서 내 돈은 빠졌는데 상대 계좌에 안 들어가면 큰일이잖아요. 그래서 트랜잭션은 네 가지 성질(ACID)을 지켜요. 또 여러 사람이 같은 데이터를 동시에 고치면 꼬이니까, 순서를 정리하는 병행 제어가 필요해요. 대표 방법이 데이터에 자물쇠를 거는 로킹이에요.
시험용 정의
트랜잭션은 데이터베이스의 상태를 바꾸는 하나의 논리적 작업 단위다. 특성 ACID: 원자성(Atomicity, 전부 또는 전무), 일관성(Consistency, 실행 후에도 일관된 상태), 독립성·격리성(Isolation, 실행 중인 트랜잭션에 다른 트랜잭션이 끼어들 수 없음), 영속성·지속성(Durability, 완료된 결과는 영구 반영). 상태는 활동 → 부분 완료 → 완료, 실패 시 실패 → 철회다. 회복은 장애 시 이전 상태로 되돌리는 것으로 로그를 이용한 REDO(재실행)와 UNDO(취소), 즉시 갱신, 지연 갱신, 검사점(Checkpoint), 그림자 페이징이 있다. 병행 제어는 동시에 실행되는 트랜잭션이 일관성을 해치지 않게 하는 것으로 로킹, 2단계 로킹(확장 → 축소), 타임스탬프 순서, 낙관적 검증, 다중 버전 기법이 있다.
비유로 이해하기
은행 창구 이체다. 출금과 입금은 한 묶음이라 하나만 되면 안 된다(원자성). 내가 이체하는 동안 다른 창구가 같은 통장을 건드리지 못하게 통장에 자물쇠를 건다(로킹).
자세히
먼저 알아 둘 말
| 말 | 뜻 |
|---|---|
| 로그 | 트랜잭션이 바꾼 내용의 이전 값·이후 값을 적어 둔 기록 |
| REDO / UNDO | 로그로 완료된 작업을 다시 실행 / 미완료 작업을 취소 |
| 검사점 | 회복할 때 로그를 처음부터 다 보지 않도록 표시해 둔 지점 |
| 로킹 | 데이터에 잠금을 걸어 다른 트랜잭션이 접근하지 못하게 하는 기법 |
| 로킹 단위 | 잠금을 거는 데이터 크기 (DB, 테이블, 행, 필드) |
ACID
| 성질 | 뜻 | 보장 수단 |
|---|---|---|
| 원자성 (A) | 모두 반영 또는 전혀 반영 안 됨 | COMMIT·ROLLBACK, 회복 기법 |
| 일관성 (C) | 실행 전후 모두 일관된 상태 | 무결성 제약 |
| 독립성 (I) | 다른 트랜잭션이 중간 결과를 볼 수 없음 | 병행 제어 |
| 영속성 (D) | 완료한 결과는 장애가 나도 유지 | 회복 기법 |
트랜잭션 상태
| 상태 | 뜻 |
|---|---|
| 활동 (Active) | 실행 중 |
| 부분 완료 (Partially Committed) | 마지막 연산까지 실행했지만 COMMIT 전 |
| 완료 (Committed) | COMMIT으로 성공적으로 끝남 |
| 실패 (Failed) | 오류로 더 진행할 수 없음 |
| 철회 (Aborted) | ROLLBACK으로 실행 전 상태로 되돌림 |
로킹 단위와 병행성
로킹 단위가 크면 잠금 수가 적어 관리가 쉽지만 병행성은 낮아진다. 단위가 작으면 관리가 복잡하고 오버헤드가 크지만 병행성은 높아진다.
2단계 로킹: 잠금만 하는 확장 단계, 해제만 하는 축소 단계로 나눠 직렬 가능성을 보장한다. 교착 상태는 생길 수 있다.
병행 제어가 없을 때 문제
| 문제 | 뜻 |
|---|---|
| 갱신 분실 (Lost Update) | 두 트랜잭션이 같은 값을 고쳐 한쪽 변경이 사라짐 |
| 모순성 (Inconsistency) | 다른 트랜잭션이 고치는 중간 값을 읽어 불일치 |
| 연쇄 복귀 (Cascading Rollback) | 한 트랜잭션이 철회되며 그 값을 읽은 다른 트랜잭션도 철회 |
| 비완료 의존성 | 완료되지 않은 트랜잭션의 결과를 다른 트랜잭션이 참조 |
시험에 이렇게 나와요
- ACID → 원자성(COMMIT·ROLLBACK으로 보장)·일관성·격리성(다른 트랜잭션 끼어들기 금지)·영속성
- 로킹 단위가 작으면 → 병행성 높고 오버헤드 큼 / 크면 → 병행성 낮고 오버헤드 작음
- 병행 제어 기법 → 로킹·타임스탬프 순서·낙관적(검증)·다중 버전 (시분할은 아님)
- 처리 순서를 미리 정하는 직렬화 기법 → 타임스탬프
- 트랜잭션 상태 → 활동·부분 완료(마지막 연산 직후)·완료·실패·철회(ROLLBACK 후)
- 로그가 필요한 회복 → 즉시(즉각) 갱신·지연 갱신 / 병행 제어 목적 → 공유 최대화·응답 시간 최소화·일관성 유지
확인 문제
Q1. 트랜잭션의 연산은 모두 반영되거나 전혀 반영되지 않아야 한다는 성질은?
- 일관성
- 독립성
- 지속성
- 원자성
정답 보기
4번 원자성
원자성(Atomicity)은 All or Nothing. 중간에 실패하면 ROLLBACK으로 모두 취소한다.
Q2. 로킹 단위에 대한 설명으로 옳은 것은?
- 로킹 단위가 작으면 병행성이 높아지고 오버헤드가 커진다
- 로킹 단위는 데이터베이스 전체만 가능하다
- 로킹 단위가 크면 병행성이 높아진다
- 로킹 단위가 작으면 로크 수가 적어진다
정답 보기
1번 로킹 단위가 작으면 병행성이 높아지고 오버헤드가 커진다
작을수록 병행성↑, 관리 부담↑.
Q3. 트랜잭션이 마지막 연산까지 실행했지만 아직 COMMIT하기 전인 상태는?
- 활동
- 완료
- 철회
- 부분 완료
정답 보기
4번 부분 완료
Partially Committed.
Q4. 완료된 트랜잭션의 결과는 시스템 장애가 나도 영구히 반영되어야 한다는 성질은?
- 독립성
- 일관성
- 원자성
- 영속성
정답 보기
4번 영속성
영속성(Durability)이다. 원자성은 전부 되거나 전부 취소, 일관성은 규칙을 지킨 상태 유지, 독립성은 동시에 실행돼도 서로 간섭하지 않는 성질이다.
Q5. 장애 회복 기법이 아닌 것은?
- 즉시 갱신
- 2단계 로킹
- 지연 갱신
- 그림자 페이징
정답 보기
2번 2단계 로킹
2단계 로킹은 병행 제어 기법이다. 즉시 갱신·지연 갱신(로그 기반), 그림자 페이징은 장애 회복 기법이다.
헷갈리기 쉬운 O·X
독립성은 둘 이상의 트랜잭션이 동시에 실행될 때 서로의 중간 연산에 끼어들 수 없다는 성질이다.
정답 보기
O
REDO는 완료되지 않은 트랜잭션의 작업을 취소하는 것이다.
정답 보기
X 그건 UNDO. REDO는 완료된 작업을 다시 반영.
2단계 로킹은 교착 상태를 완전히 막아 준다.
정답 보기
X 직렬 가능성은 보장하지만 교착 상태는 생길 수 있다.