-
재고 - 주문 프로세스에서의 동시성 제어Web Programming 2022. 1. 26. 16:29반응형
문제
재고 - 주문 프로세스에서 하나의 재고를 동시에 주문할 시 발생하는 동시성의 문제를 해결하기 위함
프로세스 순서
Lock 종류
Shared Lock(Read Lock) : 데이터를 읽을 때 사용되는 Lock으로 같은 Read 끼리는 동시 접근 가능
Exclusive Lock(Write Lock) : 데이터를 변경할 때 사용되는 Lock으로 해당 Lock이 해제될 때까지 어떤 접근도 허용하지 않음
Transaction Isolation Level 종류
위의 Lock을 Transaction에 따라 자동으로 걸어주는 기준을 의미
- READ UNCOMMITED
- COMMIT 여부와 관계 없이 데이터를 조회
- 수정 중인 데이터를 조회하는 Dirty Read 발생 가능
- READ COMMITED
- COMMIT 전의 데이터를 이전의 데이터를 임시 보관하는 UNDO 영역에서 참조
- 한 트랜잭션 내에서 동일한 SELECT에 대하여 다른 값이 반환되는 NON-REPEATABLE READ 문제 발생 가능
- REPEATABLE READ
- TRANSCATION에서의 첫 SELECT 수행 시간을 기준으로 모든 조회를 해당 시점 기준의 UNDO 영역에서 참조
- SERIALIZABLE
- 모든 SELECT가 SELECT FOR SHARE 형태로 동작
- 동시처리 능력이 다른 격리수준보다 떨어짐
- 두 TRANSCATION의 교착상태인 DEADLOCK 가능성 높음
비관적 잠금에서의 Solution:
1. 데이터 lock 수준을 SERIALIZABLE 수준으로 업데이트
- 동시처리 능력이 너무 떨어져 해당 LOCK으로 인한 모든 타 요청을 재시도 해야함
2. SELECT FOR UPDATE를 활용
- 명시적으로 SERIALIZABLE 수준으로 LOCK을 잡고 해당 트랜잭션이 종료되면 해제
3. TRANSACTION의 Write Lock을 활용하여 일관성 유지
낙관적 잠금에서의 Solution:
1. 테이블에 Version 컬럼을 추가하여 값을 수정할 때 Version이 동일하면 수정이 가능하고 상이할 시 실패
- 두 세션이 동일한 버전으로 수정을 요청할 시 Version Conflict가 발생하여 Affected Row Count가 0이 되므로 재시도 필요
Solution 후보
장점 : 완전 무결성 보장 가능
단점 : 인앱 결제 진행하는 동안 같은 제품에 대하여 주문 불가능
장점 : 사용자가 결제만 진행하고 주문에 실패하는 오류를 방지
단점 : 결제 요청 모듈에서 대기 상태가 진행될 경우 결제 완료 없이 주문 상태 유지
장점 : 사용자가 결제만 진행하고 주문에 실패하는 오류를 방지
단점 : 결제 요청 모듈에서 대기 상태가 진행될 경우 결제 완료 없이 주문 상태 유지
장점 : 결제 없이 주문 불가능, 결제 완료 후 주문에 실패 시 A/S 가능
단점 : 결제 완료 후 주문에 실패하는 경우 발생
최종 Solution
이유
- 실시간으로 조회되어야 하는 기능이 존재하기 때문에 SERIALIZABLE 수준의 ISOLATION LEVEL은 사용 불가
- 발생할 수 있는 오류를 최소화 하며 재고에 대한 동시성 문제 해결
참고:
https://techblog.woowahan.com/2709/
https://hwannny.tistory.com/81
https://dololak.tistory.com/446
반응형'Web Programming' 카테고리의 다른 글
Z-Index (0) 2022.08.24 Multi-Tenancy의 개념 (0) 2022.06.27 검색엔진 최적화(SEO) (0) 2021.09.29 Parent Node 클릭 시 Child Node로 인해 정상적으로 이벤트 작동이 하지 않을 때 (0) 2021.09.07 log4j의 개념과 사용법 (0) 2021.01.08 - READ UNCOMMITED