Transaction 격리 수준!?
2025. 4. 9. 00:30
들어가기 전에
트랜잭션 격리 수준을 항해 플러스 과정에서 처음 듣게 되었다.
핑계를 조금 보태자면 세일즈 포스 개발을 업무로 하기 때문에
데이터 베이스에 대해서 거의 무지랭이에 가까운데,
트랜잭션 격리 수준이 과연 무엇을 의미하는 것일까?
트랜잭션 격리 수준 정의
→ 여러 트랜잭션 수행 시, 데이터를 일관성 있게 보장하는 기준
조금 더 풀어서 설명하면
여러 트랜잭션이 동시에 수행되다 보면 특정 자원에 동시에 접근하게 된다.
이로 인한 동시성 문제는 아래 3가지로 나눌 수 있다.
1. Dirty Read
A: 잔액을 100 → 50 (커밋 전)
B: 잔액 조회 → 50
A: 롤백 → 100
B는 잘못된 50을 읽은 셈
커밋되지 않은 데이터를 읽는 문제B: 잔액 조회 → 50
A: 롤백 → 100
B는 잘못된 50을 읽은 셈
2. Non-Repeatable Read
B: 이름 조회 → "Alice"
A: 이름 변경 → "Bob", 커밋
B: 다시 조회 → "Bob"
같은 데이터를 반복 조회해도 결과가 달라지는 문제A: 이름 변경 → "Bob", 커밋
B: 다시 조회 → "Bob"
3. Phantom Read
B: SELECT * FROM users WHERE age > 30 → 3명
A: 나이 35인 사용자 추가, 커밋
B: 같은 쿼리 다시 실행 → 4명
같은 조건으로 조회해도 결과 행 수가 달라지는 문제A: 나이 35인 사용자 추가, 커밋
B: 같은 쿼리 다시 실행 → 4명
격리 수준 상세
1. Read Uncommitted
성능은 좋지만 일관성이 낮아 거의 사용되지 않음
2. Read Committed
Dirty Read 방지 가능, Non-Repeatable Read는 발생할 수 있음
대부분의 DB의 기본 설정
3. Repeatable Read
T10: '김연습' 조회 → '김연습'
T11: '김연습' → '최수련' 변경 후 커밋
T10: 다시 조회 → '김연습'
Phantom Read는 발생할 수 있음T11: '김연습' → '최수련' 변경 후 커밋
T10: 다시 조회 → '김연습'
4. Serializable
- Range Lock 사용 → 조건 전체 잠금
- MVCC → 충돌 시 롤백
정리해보면…
트랜잭션 격리 수준은 아래와 같은 동시성 문제를 얼마나 허용할 것인가에 따라 결정된다.
- Dirty Read – 커밋되지 않은 데이터 읽기
- Non-Repeatable Read – 같은 조회인데 결과 값이 다름
- Phantom Read – 같은 조건인데 행 수가 다름
📌 트랜잭션 격리 수준 비교
격리 수준 | 허용되는 동시성 문제 |
---|---|
Read Uncommitted | Dirty Read 허용 |
Read Committed | Non-Repeatable Read 허용 |
Repeatable Read | Phantom Read 허용 |
Serializable | 모든 동시성 문제 차단 |
격리 수준은 동시성 처리와 성능 사이의 균형을 선택하는 문제이다.
비즈니스 로직에 따라 적절하게 선택되어야 한다.