트랜잭션 격리수준(Transaction Isolation Level)은 동시에 실행되는 여러 트랜잭션들 간의 데이터 접근을 제어하는 메커니즘입니다. SQL 표준에서는 4가지 격리수준을 정의하고 있으며, 각각 다른 수준의 데이터 일관성과 동시성을 제공합니다.
1. READ UNCOMMITTED (레벨 0)
가장 낮은 격리수준으로, 커밋되지 않은 데이터도 읽을 수 있습니다.
특징:
다른 트랜잭션이 수정 중인 데이터를 읽을 수 있음
가장 높은 동시성을 제공하지만 데이터 일관성이 가장 낮음
거의 사용되지 않는 격리수준
발생 가능한 문제:
Dirty Read: 아직 커밋되지 않은 데이터를 읽는 현상
Non-Repeatable Read: 같은 쿼리를 반복 실행했을 때 다른 결과가 나오는 현상
Phantom Read: 범위 검색 시 이전에 없던 레코드가 나타나는 현상
커밋된 데이터만 읽을 수 있음
Dirty Read 문제를 해결
읽기 작업 시 공유락(Shared Lock)을 사용하되, 읽은 즉시 해제
발생 가능한 문제:
Non-Repeatable Read: 트랜잭션 도중 다른 트랜잭션이 데이터를 수정하면 같은 쿼리의 결과가 달라질 수 있음
Phantom Read: 범위 검색에서 새로운 레코드가 추가되거나 삭제될 수 있음
해결된 문제:
Dirty Read 방지
트랜잭션이 읽은 데이터에 대해 트랜잭션 완료까지 공유락 유지
같은 쿼리를 반복 실행해도 동일한 결과 보장
MySQL InnoDB의 기본 격리수준
발생 가능한 문제:
Phantom Read: 범위 검색 시 새로운 레코드가 나타날 수 있음 (일부 DBMS에서는 해결됨)
해결된 문제:
Dirty Read 방지
Non-Repeatable Read 방지
모든 읽기/쓰기 작업에 대해 범위락(Range Lock) 사용
완전한 데이터 일관성 보장
가장 낮은 동시성 (성능 저하 가능성 높음)
해결된 문제:
Dirty Read 방지
Non-Repeatable Read 방지
Phantom Read 방지
격리수준별 문제점 정리

*MySQL InnoDB에서는 REPEATABLE READ에서도 Phantom Read가 방지됩니다.
일반적인 웹 애플리케이션
높은 동시성이 필요한 경우
약간의 데이터 불일치를 허용할 수 있는 경우
REPEATABLE READ 권장 상황:
금융 시스템 등 데이터 일관성이 중요한 경우
보고서 생성 등 일관된 데이터 조회가 필요한 경우
SERIALIZABLE 권장 상황:
완벽한 데이터 일관성이 필수적인 경우
동시성보다 정확성이 우선인 시스템
격리수준이 높아질수록 데이터 일관성은 향상되지만 동시성은 떨어지므로, 애플리케이션의 요구사항에 따라 적절한 수준을 선택해야 합니다.