You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Product 의 quantity 와 Stock 의 데이터 정합성이 일치하지 않을 수도 있다.
재고에 접근하기 위해서는 반드시 해당 상품에 락을 걸어야한다.
사용
00 : 00 에 그날부터 유통기한 때문에 정책상 판매하지 못하는 재고를 삭제합니다.
이때 상품에 락 을 건 뒤 재고를 삭제하고 stock 의 재고 수량에 맞게 상품 수량을 변경한 뒤 커밋합니다.
상품에 재고를 추가할 때
상품에 락 을 건 뒤 재고를 추가하고 추가된 수량만큼 상품 수량을 변경한 뒤 커밋합니다.
상품을 구매할 때
상품에 락을 건 뒤 재고만 감소하고 커밋합니다.
3번과 같이 했을 때 Product 의 quantity 와 재고 테이블간의 정합성이 맞지 않습니다. 하지만 상관 없습니다. 재고에 접근하기 위해서는 항상 상품에 락을 걸어야하기 때문입니다. 그럼에도 불구하고 정합성이 맞아야하는 시점이 있습니다. 그 시점은 “유통기한 때문에 정책상 판매하지 못하는 재고를 삭제해야하는 경우” 이전에는 반드시 정합성이 맞아야합니다.
4번의 이유 때문에 1번 전에 정합성을 유지하기 위해 상품에 락을 건 뒤 상품에 대한 재고를 모두 락을 건 뒤 조회하고 정합성을 맞춰줍니다.
재고 삭제를 위해 접근하는 경우는 5번 , 1번 입니다. 특히 5번과 1번이 실행될 때 재고 테이블에 접근하는 경우는 단 하나의 쓰레드임이 보장됩니다. 즉 , 동시성 문제가 발생할 수가 없습니다.
뿐만 아니라 항상 재고 테이블에 접근하기전 상품에 락을 걸기 때문에 5번과 1번 수행 중에 그 어떤 쓰레드라도 해당 상품에 접근할 수 없습니다.
상품에 접근할 수 없기 때문에 재고에도 접근할 수 없음이 보장됩니다.
재고 추가를 위해 접근하는 경우는 2번입니다. 재고를 추가하기 위해 상품에 락 을 걸어야하기 때문에 재고 삭제를 위해 접근하는 경우와 배타적으로 실행됩니다.
핵심 내용은 재고 테이블에 접근을 위해서 항상 해당 상품에 락 을 건다면 재고 테이블에 대한 동시성 문제를 해결할 수 있고 재고가 없는데 구매했다거나 , 유통기한이 지났는데 판매가 될 수 있다거나 하는 이유를 완전히 해결할 수 있습니다.
뿐만아니라 사용하는 입장에서는 상품에 락을 건뒤 수량만 변경해주면 되기 때문에 더 간편합니다.
구현
재고 감소의 경우 상품에 락을 건 뒤 상품 수량만 변경한 뒤 커밋한다.
재고 추가의 경우 상품에 락을 건 뒤 재고를 추가하고 상품 수량을 추가한 뒤 커밋한다.
재고 삭제의 경우
00:00 에 상품 마다 3번(재고의 정합성)과 1번(유통기한 정책)을 위해 상품에 락을 건 뒤 다음 절차로 실행합니다.
재고 테이블에서 해당 상품에 해당 하는 재고를 모두 락을 걸어서 가져옵니다.
상품 수량과 현재 재고 테이블에 대한 정합성을 맞춰줍니다. (재고 테이블에서 재고를 상품 수량에 맞게 삭제합니다)
이후 유통기한 정책에 의해 삭제되어야하는 재고를 삭제해줍니다.
유통기한 정책에 의해 삭제된 만큼 상품 재고를 변경한 뒤 커밋합니다.
왜 이렇게 해야 돼?
재고의 동시성을 위해서 상품에 락을 거는 행위는 필연적입니다.
재고 감소의 경우 상품 수량만 변경하고 재고 테이블과 정합성을 즉시 맞추지 않는 이유는 재고에 너무 자주 락이 걸리기 때문입니다.
이는 재고 감소에 락을 잡고 있는 시간이 굉장히 길다고 생각했고 락을 잡는 시간을 최소한으로 줄이기 위해
하나의 상품에 대해 재고 테이블에 락을 잡는 시점을 하루 중 단 한번 , 유통기한 정책을 실행하기 전으로 수행하면 모든 요구사항을 만족하면서
재고 락을 최소한으로 잡을 수 있습니다.
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
-
재고 관련
전제
반드시
해당상품에 락
을 걸어야한다.사용
상품에 락
을 건 뒤 재고를 삭제하고 stock 의 재고 수량에 맞게 상품 수량을 변경한 뒤 커밋합니다.상품에 락
을 건 뒤 재고를 추가하고 추가된 수량만큼 상품 수량을 변경한 뒤 커밋합니다.3번
과 같이 했을 때 Product 의 quantity 와 재고 테이블간의 정합성이 맞지 않습니다. 하지만 상관 없습니다. 재고에 접근하기 위해서는 항상 상품에 락을 걸어야하기 때문입니다. 그럼에도 불구하고 정합성이 맞아야하는 시점이 있습니다. 그 시점은 “유통기한 때문에 정책상 판매하지 못하는 재고를 삭제해야하는 경우” 이전에는 반드시 정합성이 맞아야합니다.4번
의 이유 때문에1번
전에 정합성을 유지하기 위해 상품에 락을 건 뒤 상품에 대한 재고를 모두 락을 건 뒤 조회하고 정합성을 맞춰줍니다.재고 삭제를 위해 접근
하는 경우는5번
,1번
입니다. 특히5번
과1번
이 실행될 때 재고 테이블에 접근하는 경우는 단 하나의 쓰레드임이 보장됩니다. 즉 , 동시성 문제가 발생할 수가 없습니다.뿐만 아니라 항상 재고 테이블에 접근하기전
상품에 락
을 걸기 때문에5번
과1번
수행 중에 그 어떤 쓰레드라도 해당 상품에 접근할 수 없습니다.상품에 접근할 수 없기 때문에 재고에도 접근할 수 없음이 보장됩니다.
재고 추가
를 위해 접근하는 경우는2번
입니다. 재고를 추가하기 위해상품에 락
을 걸어야하기 때문에재고 삭제
를 위해 접근하는 경우와 배타적으로 실행됩니다.핵심 내용은 재고 테이블에 접근을 위해서 항상 해당
상품에 락
을 건다면 재고 테이블에 대한 동시성 문제를 해결할 수 있고 재고가 없는데 구매했다거나 , 유통기한이 지났는데 판매가 될 수 있다거나 하는 이유를 완전히 해결할 수 있습니다.뿐만아니라 사용하는 입장에서는
상품에 락을
건뒤 수량만 변경해주면 되기 때문에 더 간편합니다.구현
00:00 에
상품 마다
3번(재고의 정합성)과 1번(유통기한 정책)을 위해상품에 락
을 건 뒤 다음 절차로 실행합니다.왜 이렇게 해야 돼?
재고의 동시성을 위해서 상품에 락을 거는 행위는 필연적입니다.
재고 감소의 경우 상품 수량만 변경하고 재고 테이블과 정합성을 즉시 맞추지 않는 이유는 재고에 너무 자주 락이 걸리기 때문입니다.
이는 재고 감소에 락을 잡고 있는 시간이 굉장히 길다고 생각했고 락을 잡는 시간을 최소한으로 줄이기 위해
하나의 상품에 대해 재고 테이블에 락을 잡는 시점을 하루 중 단 한번 , 유통기한 정책을 실행하기 전으로 수행하면 모든 요구사항을 만족하면서
재고 락을 최소한으로 잡을 수 있습니다.
Beta Was this translation helpful? Give feedback.
All reactions