트랜잭션 격리수준
- 여러 트랜잭션이 동시에 실행될 때 서로 간섭하지 않도록 하는 제어 수준
- 격리 수준이 낮을수록 동시성이 높아지지만 데이터 일관성이 깨질 가능성이 있음
- 격리 수준이 높을 수록 데이터 일관성이 보장되지만 성능이 저하될 수 있음
- 데이터의 일관성과 무결성을 보장하면서 동시에 성능도 조절할 수 있는 기준
트랜잭션에서 발생할 수 있는 문제점
- 격리 수준이 낮음 → 여러 트랜잭션이 동시에 수행될 때 데이터 정합성이 깨지는 문제 발생
- Dirty Read(더티 리드)
- 다른 트랜잭션에서 아직 commit 되지 않은 데이터를 읽는 문제
- 이후 롤백이 되면 잘못된 데이터를 읽게 됨
- Non-Repeatable Read(반복 읽기)
- 같은 트랜잭션에서 동일한 데이터를 여러번 조회했을 때 값이 다르게 조회되는 문제
- 다른 트랜잭션이 데이터를 수정 후 커밋하면 이전과 다른 데이터를 읽게 됨
- Phantom Read
- 같은 트랜잭션에서 같은 조건으로 조회했는데 결과가 달라지는 문제
- 다른 트랜잭션이 데이터를 INSERT / DELETE 한 경우 발생
트랜잭션 격리 수준(Isolation Level)
- 낮은 격리 수준일수록 성능은 좋지만 정합성이 낮아지고, 높은 격리 수준일수록 성능이 낮아지는 대신 정합성 보장
격리 수준 | Dirty Read | Non-Repeatable Read | Phantom Read | 성능 |
---|---|---|---|---|
READ UNCOMMITTED | O | O | O | 🔥 매우 빠름 |
READ COMMITTED | X | O | O | ✅ 빠름 |
REPEATABLE READ | X | X | O | ⏳ 보통 |
SERIALIZABLE | X | X | X | 🐌 느림 |
-
READ UNCOMMITED (읽기 미확정, 커밋되지 않은 데이터 읽기 허용)
- 다른 트랜잭션에서 commit되지 않은 데이터도 읽을 수 있음 → Dirty Read 발생
- 데이터 일관성 거의 없음, 가장 낮은 수준
- 성능은 가장 좋음
- 발생 가능 이상 현상 : Dirty Read
-
READ COMMITTED (커밋된 데이터만 허용)
- 커밋된 데이터만 읽을 수 있음 → 더티 리드 방지
- 같은 데이터를 두번 읽었을 때 값이 다를 수 있음
- 대부분 DBMS 기본값
- 발생 가능 이상 현상 : Non-repeatable Read
-
REPEATABLE READ (반복 가능한 읽기)
- 같은 트랜잭션 내에서 같은 데이터를 읽으면 항상 동일한 결과
- 읽은 데이터는 다른 트랜잭션이 수정할 수 없음 (읽은 데이터에 Shared Lock)
- 발생 가능 이상 현상 : Phantom Read → 트랜잭션 실행중 새로운 행이 생겨서 조회결과 바뀜
-
SERIALIZABLE(직렬화)
- 트랜잭션들을 순차적으로 실행한 것처럼 완전한 고립 보장
- 가장 엄격하고 안전하지만 성능 저하가 큼
- 내부적으로 모든 읽기에 공유락을 걸고, 범위 조건 조회는 갭 락 등으로 제어
- 이상 현상 모두 방지