Dirty Read
Non Repetable read(반복 가능하지 않은 읽기)현상
Repeatable Read(반복 가능한 읽기)
Phantom Read(유령읽기)
-트랜잭션 격리 수준 4단계
1. Read Uncommitted : 커밋 무시하고 중간에 읽는다, Dirty Read
2. Read Committed : 커밋된 데이터만 읽는다, Non-Repeatable Read
3. Repeatable Read : 한 트랜잭션에서 여러번 읽어도 동일함 보장, Phantom Read
4. Serializable : 한 트랜잭션에서 사용하는 데이터를 다른 트랜잭션에서 접근할 수 없다.
무결성과 정합성
- 무결성(Integrity) : 데이터 값이 정확한 상태인가? 이상한 값이 아닌가?
- 정합성(Consistency) : 모든 트랜잭션에서 같은 데이터 값이 모순 없이 일치한가 ?
트랜잭션 격리 수준
1. Read Uncommitted
커밋 전의 트랜잭션의 데이터 변경 내용을 다른 트랜 잭션을 읽는 것을 허용하는 것으로 격리 수준이 가장 낮다.
아래 참고하면 트랜잭션 A 가 커밋되지 않은 상태에서 트랜잭션 B가 DB를 조회했다. 이때 커밋되지 않고 변경된 트랜잭션 A의 값을 조회하는 것을 알 수 있다.
- Read Uncommitted 레벨에서는 Dirty-Read 현상이 발생한다.
- Dirty-Read란 트랜잭션 작업이 완료되지 않은 미완성 데이터를 읽는 것 (트랜잭션 A가 만약 트랜잭션을 끝마치지 못하고 Roll Back한다면 트랜잭션 B는 무효가 된 데이터 값을 읽는 것)을 얘기한다.
2. Read Committed
- Oracle DBMS에서 기본으로 사용되는 격리 수준
커밋이 완료된 트랜잭션의 변경사항만 다른 트랜잭션에서 조회 가능하다.
트랜잭션이 이루어지는 동안에는 다른 트랜잭션은 해당 데이터에 접근이 불가능
아직 Commit되지 않은 상태라면 트랜잭션 시작 전 값을 읽어오고 커밋하면 변경된 데이터를 읽어온다.
- Non-Repeatable Read, Phantom Read 현상이 발생
- Non-Repeatable Read는 위의 그림에서 보듯이 트랜잭션 B내에서 Select 를 두번 수행했지만 두 값이 다른 값으로 나오는 데이터 불일치 문제이다.
3. Repeatable Read
- MySQL의 InnoDB 스토리지 엔진에서 기본으로 사용되는 격리 수준이다.
마찬가지로 Commit 이 완료된 데이터만 읽을 수 있다.
Read Committed와 다른 점은 한 트랜잭션이 조회한 데이터는 트랜잭션이 종료될 때 까지 다른 트랜잭션이 변경하거나 삭제하는 것을 막으므로 한 번 조회한 데이터는 반복적으로 조회해도 같은 값을 반환한다.
- Phantom Read 발생한다.
- Phantom Read 란 한 트랜잭션에서 특정 레코드가 보였다가 안보였다가 하는 현상이다, 한 트랜잭션에서 값을 읽었을 때, 첫번째 때는 안보이던 레코드가 두번째 조회에서는 보이는 현상이다.
4. Serializable
한 트랜잭션에서 사용하는 데이터를 다른 트랜잭션에서 접근할 수 없다.
- 트랜잭션의 성질인 ACID를 엄격하게 지키기 때문에 성능은 가장 떨어진다.
- 단순 SELECT 문으로도 트랜잭션이 커밋될 때까지 모든 데이터에 LOCK이 설정되어 다른 트랜잭션에서 해당 데이터를 변경할 수 없게 된다.
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 |
참고