BLOG
Tracefield · 02
Tracefield · 01
블로그 · 14
Vibe Audit · 04
Vibe Audit · 03
Vibe Audit · 02
Vibe Audit · 01
출판편집자 · 01
StudyTree · 01
SecurityOps · 02
SecurityOps · 01
AI챗봇 · 04
AI챗봇 · 03
AI챗봇 · 02
AI챗봇 · 01
퍼플심 · 04
퍼플심 · 03
퍼플심 · 02
퍼플심 · 01
블로그 · 13
rootscan · 07
rootscan · 06
블로그 · 12
블로그 · 11
블로그 · 10
블로그 · 09
블로그 · 08
블로그 · 07
블로그 · 06
블로그 · 05
블로그 · 04
블로그 · 03
블로그 · 02
블로그 · 01
rootscan · 05
rootscan · 04
rootscan · 03
asmspeak · 03
asmspeak · 02
rootscan · 02
asmspeak · 01
rootscan · 01
웹보안도구 · 02
웹보안도구 · 01
루트캠프 · 02
루트캠프 · 01
All notes 167
트랜잭션 격리 수준
1. 트랜잭션 격리 수준이란
트랜잭션 격리 수준은 여러 트랜잭션이 동시에 실행될 때, 서로가 바꾼 데이터를 어디까지 볼 수 있게 할지 정하는 기준이다.
데이터베이스는 동시성과 일관성을 동시에 챙겨야 하지만, 둘을 항상 최대치로 맞출 수는 없다. 격리 수준은 그 사이 균형점을 잡는 설정이다.
2. 동시성 환경에서 생기는 문제
격리 수준을 이해하려면 먼저 어떤 문제가 생기는지부터 알아야 한다.
- 더티 리드(Dirty Read): 아직 커밋되지 않은 데이터를 다른 트랜잭션이 읽는 현상이다. 나중에 롤백되면 존재하지 않는 값을 읽은 셈이 된다.
- 논-리피터블 리드(Non-Repeatable Read): 같은 트랜잭션 안에서 같은 데이터를 두 번 읽었는데, 중간에 다른 트랜잭션이 수정하고 커밋해서 값이 달라지는 현상이다.
- 팬텀 리드(Phantom Read): 범위 조건으로 조회했을 때, 중간에 새 행이 끼어들어 없던 데이터가 나타나는 현상이다. 기존 행 수정이 아니라 새 행이 추가된다는 점이 다르다.
3. 격리 수준 4단계
격리 수준은 낮은 단계부터 보면 흐름이 이해하기 쉽다.
- READ UNCOMMITTED
- 커밋되지 않은 데이터까지 읽을 수 있는 가장 낮은 단계다.
- 성능은 빠르지만 더티 리드가 발생한다. 정합성이 중요한 서비스에서는 거의 쓰지 않는다.
- READ COMMITTED
- 커밋된 데이터만 읽는다.
- 더티 리드는 막지만, 논-리피터블 리드는 여전히 생길 수 있다.
- Oracle과 PostgreSQL 기본값으로 많이 알려져 있다.
- REPEATABLE READ
- 트랜잭션 시작 시점 스냅샷을 기준으로 같은 값을 유지한다.
- 논-리피터블 리드를 막는다.
- 표준상 팬텀 리드는 가능하지만, MySQL이나 PostgreSQL 같은 실제 DBMS에서는 이 단계에서 많이 억제된다.
- MySQL 기본 격리 수준이기도 하다.
- SERIALIZABLE
- 동시에 실행되는 트랜잭션을 사실상 순차 실행한 것처럼 보장하는 가장 높은 단계다.
- 더티 리드, 논-리피터블 리드, 팬텀 리드를 모두 막는다.
- 대신 공유 잠금이 많아져 동시성과 처리량이 크게 떨어질 수 있다.
- 금융, 정산, 회계처럼 정합성이 절대 우선인 영역에서 쓴다.
4. MVCC(Multi-Version Concurrency Control)
MVCC는 락을 과하게 걸지 않고도 격리성을 확보하려는 방식이다. 데이터를 수정할 때 기존 값을 바로 덮어쓰지 않고, 이전 버전을 남겨 여러 버전이 공존하게 만든다.
이 구조 덕분에 읽기 트랜잭션은 쓰기 작업이 끝날 때까지 무조건 기다릴 필요가 없다. 자신이 봐야 할 스냅샷 버전을 읽으면 되기 때문이다.
5. 실무 정리
실무에서는 결국 성능과 정합성을 같이 보고 고른다.
- 격리 수준이 올라갈수록 더티 리드, 논-리피터블 리드, 팬텀 리드를 순서대로 더 많이 막는다.
- MySQL은 Next-Key Lock 덕분에 REPEATABLE READ에서도 팬텀 리드를 많이 막는다. 표준 정의와 실제 구현이 다른 대표 사례다.
- 보통은 READ COMMITTED를 많이 쓰고, 일관성이 더 중요할 때 REPEATABLE READ에 비관적 락을 조합하는 경우가 많다.

