-
재고 - 주문 프로세스에서의 동시성 제어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 후보
Case 1. 인앱 결제까지 Transaction에 포함 장점 : 완전 무결성 보장 가능
단점 : 인앱 결제 진행하는 동안 같은 제품에 대하여 주문 불가능
Case 2. 미리 추가된 결제 Row를 업데이트하는 방식 장점 : 사용자가 결제만 진행하고 주문에 실패하는 오류를 방지
단점 : 결제 요청 모듈에서 대기 상태가 진행될 경우 결제 완료 없이 주문 상태 유지
Case 3. 결제 실패 시 Commit된 Row를 수동 Rollback하는 방식 장점 : 사용자가 결제만 진행하고 주문에 실패하는 오류를 방지
단점 : 결제 요청 모듈에서 대기 상태가 진행될 경우 결제 완료 없이 주문 상태 유지
Case 4. 결제 성공 시 결제 테이블에 INSERT 하는 방식 장점 : 결제 없이 주문 불가능, 결제 완료 후 주문에 실패 시 A/S 가능
단점 : 결제 완료 후 주문에 실패하는 경우 발생
최종 Solution
최종 : 결제 성공 시 Transaction 진행 후 Rollback 시 결제 취소하는 방식 이유
- 실시간으로 조회되어야 하는 기능이 존재하기 때문에 SERIALIZABLE 수준의 ISOLATION LEVEL은 사용 불가
- 발생할 수 있는 오류를 최소화 하며 재고에 대한 동시성 문제 해결
참고:
[DB] 동시성 문제 해결방법
동시성 문제가 무엇이고 해결방법에 대하여 알아보도록 한다.
chrisjune-13837.medium.com
동시성 문제 - 비즈니스 애플리케이션 (Part 3) | Jayne.who();
< Back 동시성 문제 - 비즈니스 애플리케이션 (Part 3) web | 07 March 2020 Tags | concurrency architecture enterprise database jpa 시리즈 Part 1 : 동시성 문제 - 일반론 Part 2 : 동시성 문제 - 데이터베이스와 JPA Part 3 :
jaynewho.com
https://techblog.woowahan.com/2709/
선물하기 시스템의 상품 재고는 어떻게 관리되어질까? | 우아한형제들 기술블로그
{{item.name}} 안녕하세요. 저는 주문서비스팀의 서버개발자 강홍구입니다. 이 글에서는 배달의민족 선물하기 서비스의 상품권 재고관리를 위한 시스템 설계에 대한 경험을 공유드리고자 합니다.
techblog.woowahan.com
https://hwannny.tistory.com/81
비관적 잠금(선점 잠금, Pessimistic Lock)과 낙관적 잠금(비선점 잠금, Optimistic Lock)
들어가며 최근 DDD Start! 라는 DDD 관련 서적을 읽다가 비관적, 낙관적 잠금에 대한 내용이 나왔다. 애그리거트를 수정, 조회시 멀티스레드 환경에서 발생되는 문제를 다루는 내용이다. 해당 문제
hwannny.tistory.com
https://dololak.tistory.com/446
[Database] SELECT ~ FOR UPDATE 란?
SELECT ~ FOR UPDATE란 SELECT ~ FOR UPDATE 구문은 "데이터 수정하려고 SELECT 하는 중이야~ 다른 사람들은 데이터에 손 대지 마!" 라고 할 수 있습니다. 좀 더 딱딱한 표현으로는 동시성 제어를 위하여 특정
dololak.tistory.com
반응형'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