본문 바로가기
Data/DB

[DB] Dirty Read, Non-Repeatable Read, Phantom Read 예시 및 Snapshot Isolation Level | LIM

by forestlim 2023. 2. 17.
728x90
반응형

DB의 Transaction 들이 동시에 실행될 때 발생할 수 있는 이상 현상들에 대해 정리하고 예시를 통해 더 자세히 파악해보고자 한다. 

이전에 Transaction Isolation Level 에 대해서는 정리해 둔 포스팅이 있다. 

https://amazelimi.tistory.com/31

 

[MySQL] Transaction의 모든 것 | LIM

MySQL/MariaDB의 InnoDB 스토리지 엔진은 Transaction(트랜잭션) 기능을 지원한다. 📌 Transaction 단어의 뜻은 이러하다. 거래, 매매 처리과정 컴퓨터 과학 분야에서의 트랜잭션은 “더이상 분할이 불가능

amazelimi.tistory.com

위 게시글에서는 Isolation Level 이 잘 지켜지지 않았을 때 이러이러한 위와 같은 현상이 발생할 수 있다만 적어두고 따로 정리는 해두지 않아 이번 포스팅에서 정리해두고자 한다.

 

📌 Dirty-Read

아래와 같은 현상을 Dirty-Read 라고 한다.

- x에 y를 더하는 Transaction 1과, y를 70으로 바꾸는 Transaction 2가 있다고 하자.

- x를 읽는 도중, y가 70으로 바뀌어서 -> x + y = 80(10+70) 이 되었다.

- 그런데 y를 70으로 바꾸는 Transaction 이 abort 되어서 rollback 되었다고 했을 때, x + y는 20이 되어야 정상이나 80으로 처리된다. 

 

 

📌 Non-Repeatable Read(Fuzzy Read)

같은 데이터를 한 Transaction 에서 읽었음에도 불구하고 값이 달라지는 현상

- x 를 두 번 읽는 Transaction 1과 x에 40을 더하는 Transactio 2 가 있다고 하자.

- Transaction 1에서 x 를 한 번 읽고 commit 을 하지 않은 상태에서 Transaction 2가 x에 40을 더하고 commit 을 했다.

- Transaction 1에서 다시 x 를 읽으니 10 이 아니고 50이 나왔다.

 

 

 

📌 Phantom Read

한 개의 Transaction 에서 같은 조건으로 2번 읽었는데 2 번의 결과가 다른 현상. 없던 데이터가 생기는 현상


📝 정리

다음과 같이 정리할 수 있다. Isolation Level 이 밑으로 내려갈수록 안정성(데이터 일관성)은 보장이 되나, Throughput(처리량) 이 감소한다. 따라서 안정성과 처리량 사이에서 적절히 타협을 봐서 Isolation Level 을 결정해야 한다. 

Isolation Level 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

 

 

🤔 Snapshot Isolation

Concurrency Control 이 어떻게 동작할 지 구현을 바탕으로 정의된 Isolation Level 이고, 

MVCC(Multi Version Concurrency Control) 의 한 종류이다. 

  • Transaction 시작 전에 commit 된 데이터만 보임
  • First-Committer 가 Win 하는 구조
    • 같은 데이터에 동시에 두 Transaction 이 write 하는 경우 발생 시 첫번째 commit 만 반영됨
- Snapshot Isolation Level 은 밑에 그림에서 화살표처럼 각각 시작된 시점(Snapshop)을 기준으로만 동작한다.

- Transaction 1이 x가 y에 40을 이체하면서 x=10 이 된다.

- Transaction 2가 동시에 y를 읽고 y에 100을 입금하면서 y는 150 이 된다. 그 상태로 commit 한다.

- Transaction 1이 다시 y를 읽을 때 150인 y 를 읽는 것이 아니고 맨 처음 snapshot 을 뜬 시점의 y 를 읽는다. 그 때 y 값은 50

- y에 40을 더하면 y=90이 되면서 Transaction 1과 Transaction 2 에서 write-write conflict 가 발생한다.

- 하지만 Isolation Level 은 First-committer 의 commit 만 반영되는 구조이다. 따라서 Transaction 1의 snapshot은 아예 사라지게 된다. 

 

 


📚 참고

https://www.youtube.com/watch?v=bLLarZTrebU&t=25s 

 

728x90
반응형

댓글