Transaction 격리 수준!?

2025. 4. 9. 00:30

들어가기 전에


트랜잭션 격리 수준을 항해 플러스 과정에서 처음 듣게 되었다.
핑계를 조금 보태자면 세일즈 포스 개발을 업무로 하기 때문에
데이터 베이스에 대해서 거의 무지랭이에 가까운데,
트랜잭션 격리 수준이 과연 무엇을 의미하는 것일까?

트랜잭션 격리 수준 정의


→ 여러 트랜잭션 수행 시, 데이터를 일관성 있게 보장하는 기준

조금 더 풀어서 설명하면


여러 트랜잭션이 동시에 수행되다 보면 특정 자원에 동시에 접근하게 된다.
이로 인한 동시성 문제는 아래 3가지로 나눌 수 있다.

1. Dirty Read
A: 잔액을 100 → 50 (커밋 전)
B: 잔액 조회 → 50
A: 롤백 → 100
B는 잘못된 50을 읽은 셈
커밋되지 않은 데이터를 읽는 문제
2. Non-Repeatable Read
B: 이름 조회 → "Alice"
A: 이름 변경 → "Bob", 커밋
B: 다시 조회 → "Bob"
같은 데이터를 반복 조회해도 결과가 달라지는 문제
3. Phantom Read
B: SELECT * FROM users WHERE age > 30 → 3명
A: 나이 35인 사용자 추가, 커밋
B: 같은 쿼리 다시 실행 → 4명
같은 조건으로 조회해도 결과 행 수가 달라지는 문제

격리 수준 상세


1. Read Uncommitted
→ 커밋되지 않은 데이터도 읽을 수 있음 (Dirty Read 허용)
성능은 좋지만 일관성이 낮아 거의 사용되지 않음


2. Read Committed
→ 커밋된 데이터만 읽음
Dirty Read 방지 가능, Non-Repeatable Read는 발생할 수 있음
대부분의 DB의 기본 설정


3. Repeatable Read
→ 트랜잭션 시작 시점 기준, 반복 조회 시 항상 같은 결과 보장
T10: '김연습' 조회 → '김연습'
T11: '김연습' → '최수련' 변경 후 커밋
T10: 다시 조회 → '김연습'
Phantom Read는 발생할 수 있음


4. Serializable
→ Phantom Read까지 방지, 가장 강력한 격리 수준
  • Range Lock 사용 → 조건 전체 잠금
  • MVCC → 충돌 시 롤백
마치 트랜잭션을 순차적으로 실행한 것처럼 보장

정리해보면…


트랜잭션 격리 수준은 아래와 같은 동시성 문제를 얼마나 허용할 것인가에 따라 결정된다.
  • Dirty Read – 커밋되지 않은 데이터 읽기
  • Non-Repeatable Read – 같은 조회인데 결과 값이 다름
  • Phantom Read – 같은 조건인데 행 수가 다름

📌 트랜잭션 격리 수준 비교
격리 수준 허용되는 동시성 문제
Read Uncommitted Dirty Read 허용
Read Committed Non-Repeatable Read 허용
Repeatable Read Phantom Read 허용
Serializable 모든 동시성 문제 차단

격리 수준은 동시성 처리와 성능 사이의 균형을 선택하는 문제이다.
비즈니스 로직에 따라 적절하게 선택되어야 한다.