스파르타 강의에서 트랜잭션 격리 수준을 배웠다. 처음엔 어렵게 느껴졌는데 정리하다보니 이해가 됐다.
여러 트랜잭션이 동시에 실행될 때 서로 얼마나 격리시킬 것인가를 결정하는 수준이다.
트레이드오프:
커밋되지 않은 데이터도 읽을 수 있다.
장점:
단점:
커밋된 데이터만 읽을 수 있다. 대부분의 DB 기본값이다.
Non-Repeatable Read 예시:
[트랜잭션 A]
ID=100 사용자의 나이 조회 → 25세
[트랜잭션 B]
ID=100 사용자의 나이를 26세로 수정하고 커밋
[트랜잭션 A]
ID=100 사용자의 나이 다시 조회 → 26세
→ 같은 트랜잭션 안에서 같은 데이터가 다르게 조회됨
장점:
사용처:
트랜잭션이 끝날 때까지 읽은 데이터를 다른 트랜잭션이 수정하거나 삭제할 수 없다.
Phantom Read 예시:
[트랜잭션 A]
개발팀 소속 직원 조회 → 3명
[트랜잭션 B]
개발팀 소속 신규 직원 1명 추가(INSERT)하고 커밋
[트랜잭션 A]
개발팀 소속 직원 다시 조회 → 4명
→ 이전에 없던 데이터가 나타남
장점:
사용처:
가장 엄격한 격리 수준. 트랜잭션을 순서대로 하나씩 실행하는 것처럼 동작한다.
특정 범위의 데이터를 읽을 때 해당 범위 전체에 잠금을 걸어서 INSERT조차 막는다.
장점:
단점:
사용처:
| 격리 수준 | Dirty Read | Non-Repeatable Read | Phantom Read | 주요 사용처 |
|---|---|---|---|---|
| Read Uncommitted | 발생 | 발생 | 발생 | 거의 안 씀 |
| Read Committed | 방지 | 발생 | 발생 | 대부분 DB 기본값 |
| Repeatable Read | 방지 | 방지 | 발생 | MySQL 기본값 |
| Serializable | 방지 | 방지 | 방지 | 금융 시스템 일부 |
Read Committed로 충분하다. Dirty Read를 막아주면서 좋은 성능을 보장한다.
하나의 트랜잭션 내에서 조회한 값이 변하지 않아야 한다면 Repeatable Read를 고려한다.
동시성 저하를 감수하고서라도 데이터 불일치가 절대 발생하면 안 되는 시스템이라면 Serializable을 사용한다.
트랜잭션 격리 수준은 데이터 정합성과 시스템 성능 사이의 트레이드오프 관계다.
4가지 레벨:
실습으로 각 문제 상황을 직접 재현해볼 예정이다.