11_1. Transaction - 데이터 일관성 보장 - ACID Transaction은 무엇인가? 그리고 왜 필요한가?
mongoDB
2023.04.04.
11_1. Transaction - 데이터 일관성 보장 - ACID Transaction은 무엇인가? 그리고 왜 필요한가?
이번 세션에선 더 이상 읽기(Read) 퍼포먼스 개선이 아닌 트랜젝션(Transaction)에 대해 알아보도록 하겠다.
데이터베이스에서 정말 중요한 개념 중 하나이다.
- 데이터 일관성
- CUD에서 정말 중요한 개념
- 데이터 일관성을 보장해주는 안전장치임
- Atomicity
- Consistency
- Isolated
- Durability
Transaction 특성으로 위 4가지를 꼽는데, 이는 차차 살펴보도록 하겠다.
-
API를 만들면 postman에서 호출해보면서 테스트를 했었다. (한번에 1회 호출)
이를 faker 라이브러리를 통해서 호출해보도록 하겠다.
데이터 생성
모두 commentsCount가 제각각이다.
그런데 실제 comments를 보면, commentsCount랑 안맞는다.
이는 Concurrency 문제 때문에 발생한 이슈이다.
같은 document(문서)를 동시에 수정 요청이 들어와서 수정했을 때, 발생하는 문제인 것이다.
-
왼쪽그림
- 수량이 10개있고, 5개를 소모하라는 요청이 병렬로 2개가 온다면?
- 순차적으로 온다면 문제가 없을 것이다.
- 동시에 들어온다면 어떻게될까?
-
오른쪽그림
- 각 요청마다 해당 document의 값을 받아오는데 수량 10을 받아온다.
- 그리고 그 10에서 5개를 소모하고, 5개를 저장한다.
- 원래는 10개 모두 소모되어서 0개가 되어야하는데, 이런식으로 처리되어 5개만 소모된걸로 된다.
- 각 요청마다 해당 document의 값을 받아오는데 수량 10을 받아온다.
-
오른쪽 아래그림 (
Isolate
분리)- 이를 Transaction으로 감싸게되면, 요청이 병렬적으로들어와도
분리
가 된다. - 병렬로 요청이 들어오면 Transaction이 분리를 시켜버리는 것이다. 이를 isolate라고 한다.
- 즉, 하나의 요청이 끝날 때까지, 다른 요청은 대기를 하는 것이다.
- 즉, 하나의 요청이 완료될 때까지 다른 요청을 기다리게해, 10개에서 5개 소모해서 5개남은 값을 받게한다.
- 때문에 올바르게 처리가되어서 최종적으로는 0개가 남게된다.
- 이를 Transaction으로 감싸게되면, 요청이 병렬적으로들어와도
-
Consistency
(일관성) -
Durability
- Transation이 적용되면 올바른 데이터가 하드디스크에 저장이된다. (보장)
-
Atomicity
- Comment 생성시 -> 코맨트 만들고 -> 코멘트 저장하고 (2가지 API)
그런데 어떠한 네트워크 이슈 때문에, 코멘트를 만드는건 성공했지만, 저장하는데는 실패했다면, 그럼 일관되지가 않잖아?
댓글은 생성이돼서 commentsCount가 3개가 되었는데, 코멘트 저장은 실패해서, 실제 코멘트는 2개만 있다면, 일관성이 깨지게된다.
즉, 하나라도 실패하면 모두 롤백처리한다.
이것이 Atomicity이다.
코멘트 생성은 성공, 하지만 저장하는데 실패하면, 아예 코맨트 생성 전으로 롤백한다.
- Comment 생성시 -> 코맨트 만들고 -> 코멘트 저장하고 (2가지 API)
트랜젝션(Transaction)이 좋은 이유는 댓글이 생성되는 찰나에, 그걸 참조해서 API 호출이 또 들어올 수도 있잖아?
그게 불가능하다.
왜냐하면, 이 모든게 처리가되기 전까지는 외부에 노출시키지 않기 때문이다.
트랜잭션이 걸리지않은 API는 읽어올 수 있지만, 이는 변경되기 전 API를 읽어오는 것이다.