1. 핵심 개념
- 트랜잭션 (Transaction)
데이터베이스에서 하나의 논리적 작업 단위를 의미. ACID 특성을 통해 데이터 정합성을 보장.
- ACID 특성
- 원자성 (Atomicity)
- 트랜잭션 내 모든 작업은 전부 성공하거나 전부 실패해야 함.
- 일부만 적용되는 상태는 존재하지 않음.
- 일관성 (Consistency)
- 트랜잭션 완료 후 데이터베이스는 항상 정의된 제약 조건을 만족해야 함.
- 유효하지 않은 상태로 진입할 수 없음.
- 고립성 (Isolation)
- 동시에 실행되는 여러 트랜잭션이 서로의 중간 결과를 보거나 영향을 주면 안 됨.
- 마치 순차적으로 실행되는 것처럼 보여야 함.
- 영속성 (Durability)
- 트랜잭션이 커밋된 후 변경 사항은 시스템 오류에도 소실되지 않고 영구히 반영되어야 함.
- 데이터 부정합 (Data Inconsistency)
- 여러 트랜잭션이 동시 제어되지 않아 데이터가 일관되지 않은 상태가 되는 문제.
- 예: 동시 출금으로 인해 잔액 계산이 틀리는 경우.
- 락 (Lock)
- 여러 트랜잭션이 동시에 동일 자원(데이터)에 접근할 때 충돌을 방지하기 위한 메커니즘.
- 주로 쓰기 작업을 격리하기 위해 사용되며, 필요 시 읽기에도 락을 걸 수 있음.
- 격리성 레벨 (Isolation Level)
- 여러 트랜잭션이 동시에 실행될 때, 한 트랜잭션이 다른 트랜잭션의 변경을 어느 정도 볼 수 있는지를 정의하는 수준.
- 낮은 수준일수록 동시성은 높아지지만, 데이터 부정합 위험이 커짐.
- WAL (Write-Ahead Logging)
- 변경 내용을 디스크에 반영하기 전에 로그를 먼저 기록하는 방식.
- 디스크 I/O 최적화 및 장애 발생 시 복구를 지원.
- Redo Log (리두 로그)
- 커밋된 데이터 변경 사항을 저장.
- 시스템 장애 후 재시작 시 커밋된 트랜잭션 변경을 데이터베이스에 다시 적용하는 데 사용.
- Undo Log (언두 로그)
- 트랜잭션 실행 전의 이전 상태 데이터를 저장.
- 롤백 시 원래 상태로 복원하거나, 격리성 레벨을 위한 일관된 읽기를 제공하는 데 사용.
- 낙관적 락 (Optimistic Locking)
- 충돌이 드물다고 보고, 트랜잭션 실행 중 락을 걸지 않음.
- 커밋 시점에 충돌 여부를 검사하고, 충돌이 발생하면 롤백하여 재시도.
- 장점: 락 오버헤드 없음. 단점: 충돌 시 롤백 비용 발생.
- 비관적 락 (Pessimistic Locking)
- 충돌이 자주 일어날 것이라고 보고, 자원 접근 시점에 즉시 락을 획득하여 다른 트랜잭션 접근 차단.
- 장점: 충돌 자체를 사전에 방지. 단점: 락 획득/해제 오버헤드 및 대기 비용 발생.
2. 격리성 레벨 종류
- Read Uncommitted
- 커밋되지 않은 다른 트랜잭션의 변경도 읽을 수 있음.
- 발생 가능한 문제: 오손 읽기(Dirty Read).
- Read Committed
- 오직 커밋된 트랜잭션의 변경만 읽을 수 있음.
- 발생 가능한 문제: 반복 불가능한 읽기(Non-repeatable Read).
- Repeatable Read
- 같은 트랜잭션 내에서 동일한 데이터를 반복하여 읽을 때 항상 같은 값 보장.
- 발생 가능한 문제: 유령 읽기(Phantom Read).
- Serializable
- 트랜잭션들이 순차 실행되는 것처럼 동작.
- 모든 읽기 문제(오손 읽기·반복 불가능한 읽기·유령 읽기) 완벽 방지.
- 가장 낮은 동시성, 높은 락 경합.
3. 데이터 일관성 문제 사례