본문 바로가기

카테고리 없음

동시성 이슈 트러블 슈팅(작성중)

재고시스템 구현중, 주문서비스 로직에서 동시성 오류가 발생하였다.

예를 들어, 재고가 100개인 상황에서 100개의 주문을 동시에 요청했을 때, 모든 재고가 완전히 소진되지 않는 상황이 발생했다.

왜?

레이스컨디션이 일어났기 때문이다. 

레이스컨디션이란 둘 이상의 Thread가 공유 데이터에 액세스할 수 있고 동시에 변경을 하려고할 때 발생하는 문제이다.

 

그럼 내 프로젝트에선 왜 레이스 컨디션이 일어나는가?

-> A와 B가 동시에 주문을 요청했을 때, 재고 수량 갱신이 누락되는 문제가 발생할 수 있다.

예상으로는 A의 주문에 맞춰 재고수량이 변경된 뒤 B의 주문 재고수량이 수정된다 생각하지만 실제로는 A의 요청을 받고 갱신하기 전에 B의 요청을 받아 같은 재고 수를 가져오게되어 A,B모두 수량이 같은 상태에서 재고수량 갱신을 시도하게된다.

 

이를 해결하기 위해서는 우리의 예상대로 A(하나의 스레드)가 작업이 완료된 이후에 B(다른 스레드)가 데이터에 접근할 수 있도록 해야한다.