
👀 Dirty Read
커밋되지 않은 데이터를 읽음
👀 Nonrepeatable Read
동일한 명령문을 두 번 실행했을 때 다른 데이터를 볼 수도 있음
👀 Phantom Read
동일한 트랜잭션에서 동일한 값에 대해 여러 번 조회 쿼리를 수행했을 때, 존재하던 레코드가 사라지거나 없어지는 현상
조회쿼리를 수행하는 과정에서 다른 트랜잭션에서 레코드 insert / delete를 수행하고 커밋했을 경우, 해당 내용이 반영됨
| 격리 수준 | Dirty Read | Nonrepeatable Read | 팬텀 리드 | 잠금 리드 |
|---|---|---|---|---|
| READ UNCOMMITTED | O | O | O | X |
| READ COMMITTED | X | O | O | X |
| REPEATABLE READ | X | X | O | X |
| SERIALIZABLE | X | X | X | O |
💡 MySQL의 Repeatable read 수준에서는 Phantom Read가 발생하지 않는다!
- MySQL의 기본 격리 수준은 Repeatable read이며, 해당 격리 수준은 Phantom read가 발생할 수 있으나, mysql은 MVCC 덕분에 발생하지 않음
- MySQL은 MVCC를 이용해 값을 업데이트 할 경우, 언두로그에 기존 내용을 기록함
- 다른 트랜잭션은 레코드가 아니라 언두로그의 내용을 조회하기 때문에 일관성 있는 데이터를 확인할 수 있음
SELECT … FOR UPDATE문을 수행할 경우, 예외적으로 phantom read가 발생할 수 있음
- 변경 쿼리처럼 exclusive lock을 거는데, 언두 레코드에는 락을 걸 수 없어 실제 레코드에 락을 걸고 실제 레코드값을 가져오게 됨