인프런 커뮤니티 질문&답변

ABBCD님의 프로필 이미지
ABBCD

작성한 질문수

재고시스템으로 알아보는 동시성이슈 해결방법

소스코드

동시성 문제점

작성

·

190

0

동시성 문제가 생기는 부분이 재고를 감소하고 쿼리가

update stock set quantity = :quantity where product_id = :id 이렇게 날라가서 문제가 되는것 같은데

decrease를 없애고 쿼리를

update stock set quantity = quantity - :quantity where product_id = :id 이런식으로는 안되는건가요?

JPA로는 불가능한가요?

답변 2

0

최상용님의 프로필 이미지
최상용
지식공유자

ABBCD 님 안녕하세요.
말씀하신 방법으로 해결이 가능합니다.
다만 그러한 방법을 사용하려면 where 절에 조건을 추가해주어야 할 것 같습니다.

update stock set quantity = quantity - :quantity where production_id = :id and quantity >= :quantity

강의의 예제에서는 말씀해주신 방법으로 해결이 가능하지만, 해결이 불가능한 상황들도 있기때문에 여러가지 방법을 알려드리고자 하였습니다.

감사합니다.

0

안녕하세요, 인프런 AI 인턴입니다.

질문자님의 상황에서는 동시성 문제를 해결하기 위해 데이터베이스에서 직접 UPDATE 문을 수행하여 재고 수량을 감소시키는 방식을 고려하고 계신 것 같습니다. JPA를 사용할 때, 엔티티를 가져와서 데이터를 변경하고 저장하는 과정에서 발생할 수 있는 동시성 문제를 update stock set quantity = quantity - :quantity where product_id = :id 와 같은 쿼리로 해결하고자 하는 것으로 보입니다.

실제로 JPA를 사용하는 상황에서 이러한 방식을 사용하기 위해서는 JPA의 @Query 어노테이션을 활용하여 커스텀 쿼리를 생성하고 @Modifying 어노테이션과 함께 사용할 수 있습니다. 이렇게 하면 엔티티를 로드하여 업데이트하는 대신 데이터베이스 레벨에서 직접 수량 감소를 수행할 수 있으며, 이 방식은 동시성 문제에 있어 다른 솔루션과 비교하여 더 효율적일 수 있습니다.

제가 찾아본 기존 답변 중 유사한 상황에 대해 설명하고 있는 경우는 없었으나, JPA의 @Query@Modifying에 대한 설명은 다음 URL을 통해 확인할 수 있습니다.

이러한 방식을 사용하여 동시성 문제를 해결하는 것이 적절한지 아니면 다른 방식을 사용하는 것이 더 낫다고 생각하는 경우, 추가적인 논의가 필요할 수 있습니다. 이와 관련하여 더 지식공유자와의 상세한 논의가 필요하다면, 해당 강의의 Q&A 섹션을 활용하시는 것이 좋겠습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

ABBCD님의 프로필 이미지
ABBCD
질문자

그럼 update stock set quantity = quantity - :quantity where product_id = :id 이렇게 사용하는 방식이 더 비효율적이거나 사용이 불가능한 상황이 어느때인지 알수있을까요?

ABBCD님의 프로필 이미지
ABBCD

작성한 질문수

질문하기