1. 풀어쓰기
Read Uncommitted
한 읽기 트랜잭션이 시작했을때 다른 트랜잭션은 자유롭게 UPDATE 가능하다.
한 읽기 트랜잭션은 다른 트랜잭션에서 Update 중(un-commit)인 데이터를 조회할 수 있다.
=> 다른 트랜잭션이 중간에 롤백을 해도 읽기 트랜잭션은 롤백 전 데이터를 조회할 수 있는다.
=> 다른 트랜잭션의 Update(커밋)과 무관하게 일관된 데이터를 얻을 수 없는 확률이 높다.
=> Dirty Read
Read Committed
한 읽기 트랜잭션이 시작했을때 다른 트랜잭션은 자유롭게 UPDATE 가능하다.
한 읽기 트랜잭션은 다른 트랜잭션에서 Update 완료(commit)된 데이터만 조회할 수 있다.
=> Dirty Read는 발생할 수 없다. 위 고립수준보다는 일관된 데이터를 얻을 수 있는 확률이 높다.
=> 읽기 트랜잭션이 길어졌다고 가정하면, 다른 트랜잭션의 커밋들로 인해 데이터 상태 계속 변화될 수 있다.
=> 다른 트랜잭션의 Update(커밋)에 따라 한 읽기 트랜잭션 내에서 일관된 데이터를 얻을 수 없는 확률이 있다.
=> Non-Repeatable Read
Repeatable Read
한 읽기 트랜잭션이 시작했을때 다른 트랜잭션은 자유롭게 UPDATE 가능하다.
한 읽기 트랜잭션은 자기자신 트랜잭션이 시작한 순간 이전의 데이터 상태로만 조회할 수 있다.
=> Non-Repeatable Read는 발생할 수 없다. 다른 트랜잭션의 Update(커밋)에 따라 일관된 데이터를 얻을 수 있다.
=> 아무리 다른 트랜잭션의 변경이 일어나도 한 읽기트랜잭션 내에서는 일관된 데이터를 얻을 수 있다.
=> 다른 트랜잭션의 insert, delete에 따라 한 읽기 트랜잭션 내에서 일관된 데이터를 얻을 수 없는 확률이 있다.
=> Phantom Read
Serializable
한 읽기 트랜잭션이 시작했을때 다른 트랜잭션은 INSERT, UPDATE, DELETE가 불가능하다.
=> 읽기 트랜잭션에서 일관된 데이터를 얻을 수 있는 확률이 가장 높다.
2. 트랜잭션 격리수준과 부정합 이슈를 알아야하는 이유
- 서비스를 운영할 때 동시 트랜잭션 호출 수가 증가함에 따라 읽기 트랜잭션 상 최대한 일관된 데이터를 얻을 수 있을까 고민하게 되기 때문에 위의 지식이 필요하다.
- 예상치 못한 데이터 부정합은 분명 발생할 수 있다. 하지만 위의 지식이 없이 RDBMS를 운용하다보면 버그를 찾지도, 처리하지도, 예방하지도 못한게 되기 때문에 위의 지식이 필요하다.
- 결국 동시성 제어를 더 잘 하기 위하여.
- 하지만, 현업에서는 격리수준을 수정하는 건 굉장히 크리티컬한 작업이기때문에 현 운영RDBMS의 단계를 정확히 알고 그로 인해 발생할 수 있는 부정합 이슈에 대해 인지하면 좋을 것 같다.
3. 참고자료
'Googling > cs' 카테고리의 다른 글
[DB] MVCC (feat. RDBMS 동시성 제어) (0) | 2022.04.23 |
---|---|
[CS] 동기(synchronous)와 비동기(Asynchronous)를 쉽게 이해해보기 (feat. 싱크로나이즈드 수영과 핫도그) (0) | 2022.03.18 |
[하드웨어] 보조기억장치 인터페이스 이해 (feat. HDD, SSD, NVMe, PCIe, M.2, SATA) (1) | 2021.06.04 |
[DATA] 데이터양 단위 이해 (feat. B, MB, GB, TB + LTE 속도?) (0) | 2021.06.04 |
[HTTP] RESTful API 이해 (feat. 신입개발자 자격요건) (0) | 2021.05.18 |