페이지

2026년 3월 31일 화요일

데이터 무결성과 성능의 균형, 트랜잭션 격리 수준 4단계

 

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 ReadNon-Repeatable ReadPhantom Read
Read Uncommitted발생발생발생
Read Committed방지발생발생
Repeatable Read방지방지발생 (InnoDB는 방지 가능)
Serializable방지방지방지

5. 기술사적 제언: 실무적 선택 전략

  1. 비즈니스 영향도 고려: 금융 거래와 같이 데이터 정확성이 생명인 경우 높은 수준(Repeatable Read 이상)을, 로그 수집이나 단순 통계는 성능을 위해 낮은 수준을 선택해야 합니다.

  2. MVCC(Multi-Version Concurrency Control) 활용: 현대적 DBMS는 MVCC 기술을 통해 Repeatable Read에서도 Phantom Read를 상당 부분 억제하며 성능을 확보하고 있음을 인지해야 합니다.

  3. 낙관적/비관적 잠금 병행: 격리 수준 설정만으로 부족한 경우, 애플리케이션 레벨에서 SELECT FOR UPDATE 등의 비관적 잠금을 적절히 혼합하여 데이터 정합성을 설계해야 합니다.

댓글 없음: