[DB] 09. 동시성 문제와 격리
1. 동시성(Concurrency)이란?
동시성은 여러 트랜잭션이 동시에 데이터베이스에 접근하는 상황을 의미한다.
현실적인 서비스 환경에서는 여러 사용자가 동시에 요청을 보내고, 그 요청들이 동시에 처리되는 것이 일반적이다.
이때 아무 제어도 하지 않으면, 데이터는 쉽게 꼬이게 된다.
2. 동시성 문제가 발생하는 이유
트랜잭션은 동시에 실행될 수 있다. 하지만 데이터는 공유 자원이다.
여러 트랜잭션이 같은 데이터를 동시에 읽거나 수정하면, 처리 순서에 따라 결과가 달라질 수 있다.
이 차이에서 동시성 문제가 발생한다.
3. Dirty Read
Dirty Read는 아직 COMMIT되지 않은 데이터를 다른 트랜잭션이 읽어버리는 현상이다.
상황 예시
- 트랜잭션 A가 데이터를 수정했지만 아직 COMMIT하지 않음
- 트랜잭션 B가 그 데이터를 읽음
- 트랜잭션 A가 ROLLBACK됨
결과적으로 트랜잭션 B는 실제로는 존재하지 않았던 값을 읽게 된다.
4. Non-repeatable Read
Non-repeatable Read는 같은 데이터를 두 번 읽었을 때 결과가 달라지는 현상이다.
상황 예시
- 트랜잭션 A가 데이터를 조회함
- 트랜잭션 B가 해당 데이터를 수정하고 COMMIT함
- 트랜잭션 A가 다시 같은 데이터를 조회함
같은 쿼리를 실행했는데 결과가 달라지는 문제가 발생한다.
5. Phantom Read
Phantom Read는 조회 조건에 맞는 행의 개수가 트랜잭션 도중에 바뀌는 현상이다.
상황 예시
- 트랜잭션 A가 특정 조건으로 여러 행을 조회함
- 트랜잭션 B가 조건에 맞는 새로운 행을 INSERT하고 COMMIT함
- 트랜잭션 A가 같은 조건으로 다시 조회함
처음에는 없던 행이 갑자기 나타난 것처럼 보이기 때문에 Phantom(유령)이라는 이름이 붙었다.
6. 격리 수준(Isolation Level)이란?
격리 수준은 동시에 실행되는 트랜잭션들이 서로를 얼마나 격리할 것인지를 정하는 기준이다.
격리 수준이 높을수록 데이터의 안정성은 높아지지만, 동시 처리 성능은 떨어진다.
7. 격리 수준의 종류
| 격리 수준 | Dirty Read | Non-repeatable Read | Phantom Read |
|---|---|---|---|
| READ UNCOMMITTED | 허용 | 허용 | 허용 |
| READ COMMITTED | 차단 | 허용 | 허용 |
| REPEATABLE READ | 차단 | 차단 | 허용 |
| SERIALIZABLE | 차단 | 차단 | 차단 |
8. 격리 수준을 어떻게 선택할 것인가
격리 수준은 무조건 높다고 좋은 것은 아니다.
- 데이터 정확성이 매우 중요한 경우 → 높은 격리 수준
- 동시 처리량이 중요한 경우 → 낮은 격리 수준
실제로는 DBMS의 기본 격리 수준을 그대로 사용하는 경우가 많다. (MySQL InnoDB의 기본 격리 수준은 REPEATABLE READ다.)
9. 정리
- 동시성 문제는 여러 트랜잭션이 동시에 실행될 때 발생한다
- Dirty / Non-repeatable / Phantom Read는 대표적인 문제 유형이다
- 격리 수준은 안정성과 성능의 균형을 조절하는 장치다
- 높은 격리 수준은 안전하지만 비용이 크다
'Computer Science > Database' 카테고리의 다른 글
| [DB] 11. 데이터베이스 아키텍처 (0) | 2026.02.13 |
|---|---|
| [DB] 10. 인덱스(Index)와 성능 최적화 (0) | 2026.02.07 |
| [DB] 08. 트랜잭션(Transaction)과 ACID (0) | 2026.02.07 |
| [DB] 07. JOIN의 종류와 동작 원리 (0) | 2026.02.07 |
| [DB] 06. SQL 기본 구조와 SELECT 실행 순서 (0) | 2026.02.07 |