유튜브 채널 쉬운코드의 강의 영상으로 공부하면서 작성된 게시글입니다.
Isolation level
동시에 여러 트랜잭션이 실행될 때 발생하는 이상현상을 어디까지 허용할지 사용자가 선택할 수 있도록 하는 것.
여러 트랜잭션이 동시에 실행되면 다양한 이상현상들이 발생할 수 있는데, 이 문제를 해결하기 위해 DB는 트랜잭션간의 간섭을 제어하는 격리 수준(isolation level)을 정의하고, 이를 통해 데이터의 일관성과 무결성을 보장한다.
이상 현상들
1. dirty read
commit되지 않은 변화를 읽는 문제
x = 10, y = 20인 상태에서 두가지 트랜잭션을 실행해보자
- x에 y를 더한다
- y를 70으로 바꾼다

이미지와 같은 순서로 두가지 트랜잭션이 진행된다면 x는 커밋되지도 않은 y값을 읽고 사용하는 문제가 발생했다
2. non-repeatable read
x = 10 인 상태에서 두가지 트랜잭션을 실행해보자
- x를 두번 읽는다
- x에 40을 더한다

트랜잭션 1은 분명 같은 x를 두번 읽었는데 두 값이 다른 문제가 발생했다
3. phantom read
t1 튜플의 v값이 10, t1튜플의 v값이 50인 상태에서 두가지 트랜잭션을 실행해보자
- v가10인 데이터를 두 번 읽는다
- t2의 v 를 10으로 바꾼다

트랜잭션 1에서 데이터를 두번 읽었는데 처음엔 없던 데이터가 생겨나는 문제가 발생했다
이러한 현상들은 일어나지 않는게 좋다. 그런데 이런 이상현상을 발생하지 않도록 만드는건 가능한데 그렇게하면 동시에 처리 가능한 트랜잭션 수가 줄어들어 결국 DB 성능이 떨어진다. 그래서 일부 이상현상은 혀용하는 몇가지 level을 만들어서 필요에 따라 적절하게 선택할 수 있도록 만든것이 isolation level 이다.

SQL표준 isolation level은 네가지가 있다. 이중 Serializable 레벨은 세가지 이상현상 뿐 아니라 아래 소개될 그외의 이상현상들도 발생하지 않는 level 아예 이상현상을 발생시키지 않는 level 인것. 개발자는 어떤 현상을 허용하는지에 따라 전체 처리량(throughput)과 데이터 일관성 사이에서 어느정도 거래(trade)를 할 수 있다.
4. 그외에 존재하는 이상현상들
위 3가지 이상현상은 표준SQL에서 정의한 이상현상인데 실제로는 이보다 더 많은 이상현상이 존재한다. 아래 이상현상들은 표준SQL에서 정의한 isolation level을 비판하는 논문에서 소개하는 이상현상들이다.
자세한 내용은 강의영상의 10:15~ 를 참조하자.
- dirty write : commit 안된 데이터를 write 함
- lost update : 업데이트를 덮어씀
- dirty read 확장 : commit 된 데이터를 읽어도 발생하는 dirty read
- read skew : 일관성 없는 데이터 읽기
- write skew : 일관성 없는 데이터 쓰기
- phantom read 확장 : 같은 조건을 읽지 않아도 발생하는 phantom read
snapshot isolation level
기존 표준의 level 네가지는 이상현상 3가지를 정의하고 얼만큼 허용하는지에 따라서 level을 정의했는데, snapshot isolation은 동시성 제어(Concurrency Control)를 어떻게 구현할지를 바탕으로 정의된 isolation 이다.
각 트랜잭션이 시작될 때 스냅샷을 찍고 먼저 sql문을 스냅샷에 적용한다. 그리고 commit할 때 db에 적용하는데 이 때 수정하려는 row에 먼저 write 커밋흘 한 다른 트랜잭션이 있다면 abort하는 방법.
snapshot isolation은 MVCC(Multi Version Concurrency Control) 의 한 종류.
postgreSQL의 Isolation level 목록

- postgreSQL은 SQL표준 이상현상 외에도 Serialization Anomaly라는 이상현상을 더 정의했다.
- postgreSQL에서는 repeatable read level이 snapshot isolation level이다.
- Serializable level은 SQL 표준의 3가지 이상현상 뿐 아니라 모든 이상현상을 방지한다.
'공부 > DB' 카테고리의 다른 글
| postgreSQL MVCC (0) | 2026.02.18 |
|---|---|
| DB LOCK (0) | 2026.02.18 |
| postgreSQL Transaction 트랜잭션, ACID (0) | 2026.02.16 |
| postgreSQL PRIMARY KEY, FOREIGN KEY (0) | 2026.02.16 |
| postgreSQL INDEX (0) | 2026.02.15 |