- 강의 질문
- 개발/데이터
동시성 관련 질문
안녕하세요 강의를 보는데 좀 이상한게 있어서 질문드립니다.
db로 쿠폰 발행하는 코드에 아래 같은 주석이 써있는데...
1번은 틀린거 아닌가요? policyId로 해당 policy에 락을 걸면 커밋되기 전까지는 동시성 문제 없는거 아닌가요?
3번도 데드락이 아니라 여러명이 락을 잡을려고 대기하다가 타임아웃나는 걸로 보이고
4번도 db로도 충분히 가능해보이는데 물론 성능적인 문제는 있겠으나
제가 잘못 알고 있는건가요?
그리고 분산락 잡을떄도 보통 트랜잭션 시작전에 잡지 않나요? 트랜잭션 시작하고 잡으면 분산락 놓고 커밋직전까지 시간이 있어서 동시성 문제가 일어날거 같은데요. 그리고 재고를 레디스에 올려놓고 감소시키니... 굳이 db트랜잭션을 잡아야하나 싶기도 하네요.
* 1. Race Condition 발생 가능성
* findByIdWithLock으로 쿠폰 정책에 대해 락을 걸지만, countByCouponPolicyId와 실제 쿠폰 저장 사이에 갭이 존재
* 여러 트랜잭션이 동시에 카운트를 조회하고 조건을 통과한 후 쿠폰을 저장할 수 있음
* 결과적으로 totalQuantity보다 더 많은 쿠폰이 발급될 수 있음
*
* 2. 성능 이슈
* 매 요청마다 발급된 쿠폰 수를 카운트하는 쿼리 실행
* 쿠폰 수가 많아질수록 카운트 쿼리의 성능이 저하될 수 있음
* PESSIMISTIC_LOCK으로 인한 병목 현상 발생 가능
*
* 3. Dead Lock 가능성
* 여러 트랜잭션이 동시에 같은 쿠폰 정책에 대해 락을 획득하려 할 때
* 트랜잭션 타임아웃이 발생할 수 있음
*
* 4. 정확한 수량 보장의 어려움
* 분산 환경에서 여러 서버가 동시에 쿠폰을 발급할 경우
* DB 레벨의 락만으로는 정확한 수량 제어가 어려움
*/