출처 쉬운코드 https://www.youtube.com/watchv=bLLarZTrebU&list=PLcXyemr8ZeoREWGhhZi5FZs6cvymjIBVe&index=17
Dirty Read : commit 되지 않은 변화를 읽음
x가 10 y가 20 이었을 때

Non-repeatable read : 같은 데이터의 값이 달라짐
x는 최초에 10

Phantom read : 없던 데이터가 생김
두개의 튜플이 있음 최초 t1은 v가 10 t2는 v가 50

격리수준
1. Read uncommitted : 커밋되지 않은 읽기 허용
2. Read commited : 커밋된 읽기만 허용 Dirty Read 까지 방지
3. Repeatable read : Non-repeatable read 까지 방지
4. Serializable : 3가지 현상 뿐만아니라 다른 모든 이상 현상 방지

추가적인 이상현상
Dirty write : commit 안된 데이터를 write 함
초기엔 x는 0

Lost update : 업데이트를 덮어씀
초기값은 x = 50

Dirty read는 롤백이 없을 시에도 발생할 수 있다
초기값은 x = 50, y = 50
더하면 항상 100이여야하는데 트랜잭션 2에서의 총합은 60

Read skew : inconsistent한 데이터 읽기
초기값은 x = 50, y = 50
더하면 항상 100이여야하는데 트랜잭션 2에서의 총합은 140
Non-repeatable read와 비슷함 만약 x만 읽었다고하면 50, 10이 읽

Write skew : inconsistent한 데이터 쓰
초기값은 x 50 y 50 그리고 x+y는 0보다 커야한다는 제약사항 존재

Phantom read 확장판
같은 조건을 두번 읽지 않더라도 서로 연관된 데이터가 있는 경우에는 팬텀 리드가 발생가능함
초기값 튜플하나 v는 7 카운트는 v가 10보다 큰 튜플 수 그래서 현재는 0

SNAPSHOT ISOLATION
MVCC의 (멀티버전동시성제어) 한 종류
동시성 제어의 구현에 따른 격리 수준의 레벨
값이 바뀔때 DB에 쓰는것이 아니라 스냅샷에 쓴다.
커밋한 순간 스냅샷이 DB에 적용
스냅샷은 트랜잭션을 시작한 시점이다. 다른 트랜잭션이 커밋되어 DB의 값이 바뀌어도 다른 트랜잭션은 자신이 트랜잭션을 시작한 시점의 내용을 본다. 자신의 트랜잭션 시작전의 커밋되 데이터만 보인다.
같은 데이터에 대해서 write를 할때 즉 write-write confilct가 발생했을 때 먼저 커밋한 트랜잭션만 인정해줌 늦게 커밋한 트랜잭션 롤백됨
초기값 x 50 y 50

Mysql(이노디비)은 SQL표준 4가지 격리수준을 그대로 따름
오라클은 Read committed, SERIALIZABLE이 주로 사용됨 (오라클에서 SERIALIZABLE은 스냅샷 격리로 동작)
SQL server는 4가지에 더해서 스냅샷 격리를 추가함 Repeatable Read와 Serializable의 사이에 위치
포스트그레는 SQL표준 4가지 격리 수준을 따름 (Repeatable Read가 스냅샷 격리로 동작)
RDBMS마다 제공하는 격리 수준이 다름
같은 이름의 격리 수준이라도 동작 방식이 다를 수 있음
'데이터베이스 > RDB' 카테고리의 다른 글
| 데이터베이스 동시성제어 (2) (0) | 2025.12.23 |
|---|---|
| 데이터베이스 동시성 제어 (1) (0) | 2025.12.23 |