격리 수준에 따라 발생하는 현상
1. 오손 읽기(Dirty Read)
- 읽기 작업을 하는 트랜잭션 A가 쓰기 작업을 하는 트랜잭션 B가 작업한 중간 데이터를 읽을 대 생기는 문제.
- 작업 중인 트랜잭션 B가 작업을 철회할 경우 트랜잭션 A는 무효가 된 데이터를 읽게 되고 잘못된 결과 도출.
2. 반복불가능 읽기(NON-REPEATABLE READ)
- 트랜잭션 A가 데이터를 읽고 트랜잭션 B가 데이터를 쓰고(갱신), 트랜잭션 A가 다시 한번 데이터를 읽을 때 생기는 문제.
즉, 트랜잭션 A가 읽기 작업을 다시 한 번 반복할 경우 결과가 반복되지 않는 현상 - Dirty Read와 달리 트랜잭션 B가 작업을 정상적으로 종료하여 틀린 데이터는 아니다.
3. 유령데이터 읽기(PHANTOM READ)
- 트랜잭션 A가 데이터를 읽고 트랜잭션 B가 데이터를 쓰고(삽입), 트랜잭션 A가 다시 한번 데이터를 읽을 때 생기는 문제.
즉, 트랜잭션 A가 읽기 작업을 다시 한 번 반복할 경우 이전에 없던 데이터가 나타나는 현상.
트랜잭션 격리 수준
앞의 세 가지 문제점을 해결하기 위해 락을 사용해야 하지만 DBMS는 트랜잭션을 동시에 실행시키면서 락보다 좀 더 완화된 명령어를 제공 한다.
이것을 트랜잭션 격리 수준 명령어라고 한다.
1. READ UNCOMMITTED (Level = 0)
- 격리 수준이 가장 낮은 명령어.
- 가장 빠르지만 하나의 트랜잭션이 커밋되기 전에 다른 트랜잭션에 노출되는 단점이 있다.
- 다른 트랜잭션이 COMMIT 하지 않은 데이터도 읽을 수 있다.
문제점 : Dirty Read, NON-Repeatable Read, Phantom Read
2. READ COMMITTED (Level = 1)
- 더티 페이지의 참조를 피하기 위해 자신의 데이터를 읽는 동안 공유락을 걸지만
트랜잭션이 끝나기 전에도 해지가능하다.
더보기
더티 페이지 : 트랜잭션이 데이터를 변경하고 커밋하지 않은 경우 발생.
- 다른 트랜잭션이 COMMIT 한 데이터만 읽을 수 있다.
- 어떤 트랜잭션이 접근한 행을 다른 트랜잭션이 수정할 수 있다.
ex) 트랜잭션 A가 수정한 행을 트랜잭션B가 수정할 수 있어 트랜잭션A가 같은 행을 다시 읽을 때 다른 내용이 발견될 수 있다.
문제점 : NON-Repeatable Read, Phantom Read
3. REPEATABLE READ (Level = 2)
- 하나의 트랜잭션이 수정한 행을 다른 트랜잭션이 수정할 수 없지만 새로운 행을 추가하는 것은 막지 않는다.
- 다른 격리화 수준에 비해 데이터 동시성이 낮아 최대한 사용하지 않는 게 좋다.
문제점 : Phantom Read
4. SERIALIZABLE (Level = 3)
- 트랜잭션을 순차적으로 진행시킨다.
- 실행 중인 트랜잭션은 다른 트랜잭션으로부터 완벽하게 분리된다.
- 제한이 가장 심하고 데이터의 동시성도 낮다.