728x90
반응형
DB의 Transaction 들이 동시에 실행될 때 발생할 수 있는 이상 현상들에 대해 정리하고 예시를 통해 더 자세히 파악해보고자 한다.
이전에 Transaction Isolation Level 에 대해서는 정리해 둔 포스팅이 있다.
https://amazelimi.tistory.com/31
위 게시글에서는 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
반응형
'Data > DB' 카테고리의 다른 글
[DB] MongoDB 에 대해 알아보자 | LIM (0) | 2023.03.26 |
---|---|
[DB] Clustering vs Replication vs Sharding 에 대해 알아보자 | LIM (0) | 2023.03.12 |
[DB] DML, DDL, DCL | LIM (0) | 2023.02.12 |
Apache Druid 정의와 장단점 및 ES 와의 비교 | LIM (0) | 2022.12.30 |
[DATABASE] OLAP vs OLTP | LIM (0) | 2022.12.25 |
댓글