이야기를 나눠요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
스프링 핵심 원리 - 고급편
동시성 문제에 대해 질문합니다.
안녕하세요!.. 강의와 무관한 내용이지만 마땅히 스프링 관련된 질문을 아는 곳이 없어 평소 스프링 강의를 들은 선생님께 질문을 하게 되었습니다.질문에 대한 전체 코드는 아래 링크에 작성했습니다.https://www.notion.so/7iwook/userVolunteerService-1d911afe2d6545bfa1e8247cc6006748?pvs=4 @Lock(LockModeType.PESSIMISTIC_READ) @Override public Optional<UserVolunteerWork> findByVolunteerWorkIdAndUserId(Long volunteerWorkId, Long userId) { return Optional.ofNullable(queryFactory .selectFrom(userVolunteerWork) .join(userVolunteerWork.volunteerWork, volunteerWork) .join(userVolunteerWork.user, user).fetchJoin() .where( userVolunteerWork.volunteerWork.id.eq(volunteerWorkId) .and(userVolunteerWork.user.id.eq(userId)) ).setLockMode(LockModeType.PESSIMISTIC_READ) .fetchOne()); }위 코드를 순차적 시행하면 문제없이 원하는 결과값을 반환하지만 (테스트 코드가 길어 똑같은 부분을 제외하고 차이점만 올립니다.)for (int i = 0; i < tryCnt; i++) { User user = users.get(i); try { volunteerService.approve(adminEmail, volunteerWorkId, user.getId()); successCount++; // 성공한 신청 수 증가 } catch (Exception e) { failedCount++; } }동시성 테스트를 위해 아래와 같이 구성을 하면 쿼리 결과 값이 null로 나와 EntityNotFoundException을 던지게 됩니다..int numThreads = 50; // 50명의 유저가 동시에 신청 CountDownLatch doneSignal = new CountDownLatch(numThreads); ExecutorService executorService = Executors.newFixedThreadPool(numThreads); AtomicInteger successCount = new AtomicInteger(); AtomicInteger failCount = new AtomicInteger(); for (int i = 0; i < numThreads; i++) { User user = users.get(i % users.size()); // 유저 목록에서 순차적으로 유저를 가져옴 executorService.execute(() -> { try { log.info("approved userId = {}", user.getId()); volunteerService.approve(adminEmail, volunteerWorkId, user.getId()); successCount.getAndIncrement(); // 성공한 신청 수 증가 } catch (Exception e) { e.printStackTrace(); failCount.getAndIncrement(); // 예외 처리 } finally { doneSignal.countDown(); // 쓰레드 작업 완료를 알림 } }); }인터넷에 나와있는 비관적, 낙관적 락을 모두 시도해보았으나 null로만 반환되는 현상이 나오는 데 이 현상이 동시성에 있는건지도 아직 모르겠습니다... 원인에 대해 찾아주신다면 정말 감사합니다!!좋은 강의 항상 잘 듣고 있습니다!!
-
재고시스템으로 알아보는 동시성이슈 해결방법
강의 자료랑 소스코드랑 터미널에서 치는 화면이 너무 작아요..ㅠ
화면이 너무 작아요..ㅠㅠ 너무 해상도가 높아서 그런지.. 글씨가 콩알만해서 잘 보이지 않네요... 솔직히 다시 녹화해야할거 같은데.. 보는게 너무 힘드네요 ㅠ
-
성공적인 진짜 iOS 개발자 되기 [기초부터 실무까지]
만들고 계신 강의가 있으시다는 글을 보고 질문드려요
안녕하세요방금 결제를 진행하였고 잠깐 보았는데, 스토리보드 위주로 진행이 되는 것 같아서 조금 살펴보다가 코드로 진행하는 강의를 만들고 계시다는 답변글을 보게 되었습니다..!스토리보드나 코드나 사실 크게 상관없는 입문자이지만, 코드로 시작을 하게되었다보니 아무래도 코드로 진행하는 강의로 공부를 하게되면 조금더 접근하기 좋지 않을까 싶어서 질문드려요!강의가 9~10월 출시 예정이라고 답변하셨던걸 봤었는데, 혹시 10월말쯤이 될수도있을까요?
-
성공적인 진짜 iOS 개발자 되기 [기초부터 실무까지]
강사님 오토laout 강의 7월 중순에 나오신다하셨는데 길어져서 질문 남겨요!
나오는 layout 강의에 code로 작성하는 방법도 나오나요? snapkit 나 ten 이런거요!
-
실전! 스프링 데이터 JPA
DB 동시성 이슈
안녕하세요. 선생님의 강의를 수강하고 MSA프로젝트를 수행하던 중 의문이 생겨 질문드립니다. 상황 : - order-service가 A, B 두개의 애플리케이션으로 운영되고 있습니다. - 두개의 서비스는 단일 DB를 공유합니다. - 주문 수량만큼 아이템의 수량이 감소됩니다. - 아이템의 수량은 1개가 남아있습니다. - 이때 A, B가 동시에 아이템을 한개씩 주문합니다. 이슈 : 1. A의 서비스 로직에서 아이템의 수량이 주문 가능함을 확인 2. B의 서비스 로직에서 아이템의 수량이 주문 가능함을 확인 3. A는 주문 로직을 수행, 아이템의 수량은 0이 됨 4. B는 2.에서 주문 가능함을 확인했기 때문에 주문 로직을 수행 5. B는 주문 할 수 없는 상황임에도 불구하고 주문이 완료됨 2번을 실행할 때 modified_date를 저장하고 있다가 4번에서 modified_date를 비교하여 2번과 4번 사이에 데이터가 수정되었는지를 확인하는 방법도 생각해보았는데요. 그 사이에 데이터가 수정되었다고 해서 매번 요청을 거절하는 것도 문제가 있다고 생각이 됩니다. 시간이 굉장히 짧기 때문에 이런 일이 일어날까 싶기도 한데... 실무에서는 어떻게 생각하시는지, 어떻게 해결하시는지 궁금합니다. 강의 내용에 다소 벗어난 내용이라 죄송하지만ㅠㅠ 선생님의 답변을 듣고 싶어 질문 드립니다. 감사합니다.