1. 트랜잭션 격리 수준(Transaction Isolation Level)의 개요
정의: 여러 트랜잭션이 동시에 처리될 때, 특정 트랜잭션이 데이터 변경 중인 다른 트랜잭션의 데이터를 볼 수 있게 허용할지 결정하는 수준입니다.
필요성: 격리 수준이 높을수록 데이터 일관성은 엄격해지나, 잠금(Locking)으로 인한 동시 처리 성능은 저하됩니다.
2. 격리 수준에 따른 발생 가능 부정합 현상
| 현상 (Anomaly) | 설명 |
| Dirty Read | 아직 커밋되지 않은 타 트랜잭션의 변경 데이터를 읽는 현상 |
| Non-Repeatable Read | 한 트랜잭션 내에서 같은 쿼리를 두 번 실행했을 때 그 사이 데이터가 수정되어 결과가 다른 현상 |
| Phantom Read | 한 트랜잭션 내에서 같은 쿼리를 두 번 실행했을 때 그 사이 데이터가 삽입/삭제되어 결과 건수가 다른 현상 |
3. 트랜잭션 격리 수준 4단계 및 사례 중심 설명
① Read Uncommitted (레벨 0)
특징: 커밋되지 않은 데이터도 읽기 허용. 가장 낮은 격리 수준.
사례 (Dirty Read): - A가 계좌 잔액을 100만 원에서 200만 원으로 수정(아직 커밋 전).
B가 잔액을 조회하니 200만 원으로 보임.
A가 오류로 인해 작업을 취소(Rollback)함. B는 존재하지 않는 200만 원 데이터를 근거로 업무를 처리하는 오류 발생.
② Read Committed (레벨 1)
특징: 커밋된 데이터만 읽기 허용. Oracle, SQL Server의 기본값.
사례 (Non-Repeatable Read):
B가 잔액 100만 원을 확인.
그 사이 A가 잔액을 200만 원으로 수정하고 커밋.
B가 다시 잔액을 조회하니 200만 원으로 바뀜. (한 트랜잭션 내에서 일관성 위배)
③ Repeatable Read (레벨 2)
특징: 트랜잭션 시작 시점의 스냅샷을 사용하여 동일 데이터 읽기 보장. MySQL InnoDB 기본값.
사례 (Phantom Read):
B가 '잔액 100만 원 이상' 고객을 조회 (10명 출력).
그 사이 A가 잔액 150만 원인 신규 고객을 **삽입(Insert)**하고 커밋.
B가 다시 조회하니 11명이 출력됨. (유령 데이터 발생)
④ Serializable (레벨 3)
특징: 가장 엄격한 격리. 읽기 작업 시에도 공유 잠금(Shared Lock)을 획득하여 타 트랜잭션의 수정/삽입 전면 차단.
사례: 모든 부정합 현상이 방지되나, 대량의 트랜잭션 처리 시 성능 저하 및 데드락(Deadlock) 발생 위험 급증.
4. 격리 수준별 부정합 발생 여부 요약
| 격리 수준 | Dirty Read | Non-Repeatable Read | Phantom Read |
| Read Uncommitted | 발생 | 발생 | 발생 |
| Read Committed | 방지 | 발생 | 발생 |
| Repeatable Read | 방지 | 방지 | 발생 (InnoDB는 방지 가능) |
| Serializable | 방지 | 방지 | 방지 |
5. 기술사적 제언: 실무적 선택 전략
비즈니스 영향도 고려: 금융 거래와 같이 데이터 정확성이 생명인 경우 높은 수준(Repeatable Read 이상)을, 로그 수집이나 단순 통계는 성능을 위해 낮은 수준을 선택해야 합니다.
MVCC(Multi-Version Concurrency Control) 활용: 현대적 DBMS는 MVCC 기술을 통해
Repeatable Read에서도Phantom Read를 상당 부분 억제하며 성능을 확보하고 있음을 인지해야 합니다.낙관적/비관적 잠금 병행: 격리 수준 설정만으로 부족한 경우, 애플리케이션 레벨에서
SELECT FOR UPDATE등의 비관적 잠금을 적절히 혼합하여 데이터 정합성을 설계해야 합니다.
댓글 없음:
댓글 쓰기