트랜잭션 격리 수준에 대해 공부하다가 Read Uncommitted와 Read Committed의 차이가 명확히 구분되지 않아 헷갈렸다. 그래서 더 깊이 공부한 뒤 다시 정리해 보기로 했다.
Read Uncommitted
- 가장 낮은 격리 수준이다.
- 커밋되지 않은 데이터를 다른 트랜잭션에서 읽을 수 있다.
- 성능은 좋지만, 데이터 일관성 보장 수준이 낮다.
- `Dirty Read` 문제가 발생할 수 있다.
Read Committed
- 커밋된 데이터만 읽을 수 있다.
- 하지만 한 트랜잭션이 데이터를 읽는 동안, 다른 트랜잭션이 동일 데이터를 수정하는 것을 방지하지는 못한다.
- Dirty Read는 방지하지만, `Non-Repeatable Read` 문제가 발생할 수 있다.
처음에는 두 격리 수준의 차이를 이렇게 이해했었다.
Read Uncommitted는 동시에 읽기와 수정이 모두 가능한 상태이고,
Read Committed는 동시 읽기는 제한하지만 동시 수정은 가능한 상태라고 말이다.
하지만 완전히 잘못된 이해였다!
`Read Uncommitted`는 커밋되지 않은 데이터도 읽을 수 있는 격리 수준이다.
예를 들어, A 트랜잭션이 a라는 데이터를 읽는 동안,
B 트랜잭션이 같은 a 데이터를 수정했다고 가정하자.
이 경우 A 트랜잭션이 다시 a 데이터를 읽으면,
B 트랜잭션이 수정한 값을 읽게 된다.
그런데 이후 B 트랜잭션이 롤백하면,
A 트랜잭션은 최종적으로 DB 데이터와 다른 값을 읽은 셈이 된다.
이것이 바로 `Dirty Read` 문제다.
`Read Committed`는 커밋된 데이터만 읽는 것을 보장하는 격리 수준이다.
B 트랜잭션이 a 데이터를 수정 중이더라도,
A 트랜잭션은 `커밋된 데이터만 저장된 영역(Undo 영역)`에서 a 데이터를 읽어온다.
따라서 A 트랜잭션은 항상 DB 데이터와 동일한 값을 읽을 수밖에 없다.
Dirty Read 문제는 이 방식으로 해결된다.
하지만, 동일 데이터를 수정하는 것은 방지하지 않기 때문에
트랜잭션 내에서 동일 데이터를 두 번 읽었을 때,
다른 트랜잭션이 데이터를 수정하고 커밋했다면
서로 다른 값을 읽게 될 수 있다.
이것이 바로 `Non-Repeatable Read` 문제다.
이제야 두 격리 수준의 차이를 정확히 이해했다.
Read Uncommitted는 Dirty Read 문제를,
Read Committed는 Dirty Read는 방지하지만 Non-Repeatable Read 문제를 겪는다는 점이 명확해졌다.
'공부' 카테고리의 다른 글
트랜잭션의 격리 수준 (Isolation level) (0) | 2024.11.26 |
---|---|
프로그래밍 패러다임 (0) | 2024.02.02 |
8월 계획 (0) | 2022.07.26 |