inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

소스코드

동시성 문제점

259

ABBCD

작성한 질문수 11

0

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

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

decrease를 없애고 쿼리를

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

JPA로는 불가능한가요?

java spring 동시성

답변 2

0

최상용

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

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

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

감사합니다.

0

인프런 AI 인턴

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

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

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

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

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

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

0

ABBCD

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

레디선 테스트코드에서 채널이름은 없어도 되는건가요?

0

43

2

낙관적 락을 사용할 떄 차이점

0

120

2

동시성 검증 코드에 관한 문의

0

94

2

단일연산

0

70

2

낙관적락vs. 레디스락

0

108

2

안녕하세요. 레디슨 질문있습니다..!!

0

67

2

@Lock(OPTIMISTIC)이 필요한 이유

0

90

2

get_lock 의 timeout이 3000초 이던데 너무 긴거 아닌가요?

0

132

2

DataSource Hikari 사용 이유

0

147

2

saveAndFlush 사용 이유 문의

0

113

3

비관적 락 VS 네임드 락

0

160

3

application.yaml 에 redis 정보

0

99

2

왜 클래스 이름에 Facade 가 붙나요?

0

184

2

@Transactional 으로 인한 동시성 문제 발생 원인이 궁금합니다.

0

219

2

@modifying 이용한 동시성 제어

0

168

2

DB락과 분산락

0

260

2

NamedLock 테스트 실패

0

186

2

테스트에서 트랜잭션 어노테이션 질문 있습니다.

0

172

2

optimistic Lock 재시도 질문입니다.

0

230

2

낙관적 락 테스트 실패

0

239

2

오류?

0

1627

4

LettureLockStockFacadeTest에서 오류가 발생합니다.

1

268

2

Pessimistic Lock 전체 테스트 오류 문의

0

360

3

비관적 락 vs 레디스(Lettuce)락 비교 관련 질문

0

460

2