Skip to content

[DP-482] 모의면접 완료 히스토리·포인트 중복 저장 방지#171

Merged
nYeonG4001 merged 2 commits into
developV2from
fix/DP-482-mock-interview-duplicate-history
May 18, 2026
Merged

[DP-482] 모의면접 완료 히스토리·포인트 중복 저장 방지#171
nYeonG4001 merged 2 commits into
developV2from
fix/DP-482-mock-interview-duplicate-history

Conversation

@nYeonG4001
Copy link
Copy Markdown
Collaborator

Summary

  • doFinalize()에서 findById()findByIdForUpdate() 변경으로 비관적 락(SELECT FOR UPDATE) 적용
  • 두 스레드가 동시에 PROCESSING 상태를 읽어 히스토리·포인트를 각각 저장하는 race condition 방지
  • 락 타임아웃 5초 설정 (@QueryHints) — AI 호출 지연 시 스레드 무한 대기 방지

Root Cause

MockInterviewFinalizeService.doFinalize()의 상태 체크 (status != PROCESSING) 가드가 단순 SELECT로 읽혀, async 스레드풀(core=2, max=5)에서 두 스레드가 동시에 PROCESSING을 읽고 가드를 모두 통과 → historyRepository.save() + pointService.earn() 중복 실행

Changes

파일 변경
MockInterviewSessionRepository findByIdForUpdate 추가 (PESSIMISTIC_WRITE + timeout 5s)
MockInterviewFinalizeService findByIdfindByIdForUpdate
MockInterviewFinalizeServiceTest 스텁 전체 업데이트, 테스트 2개 추가 (총 11개)

Test plan

  • MockInterviewFinalizeServiceTest 11개 전체 통과 확인
  • ./gradlew build 전체 빌드 통과 확인
  • 모의면접 완료 시 히스토리 1건만 저장되는지 확인 (중복 없음)

@sonarqubecloud
Copy link
Copy Markdown

@nYeonG4001 nYeonG4001 merged commit 1a0ccdd into developV2 May 18, 2026
4 checks passed
@nYeonG4001 nYeonG4001 deleted the fix/DP-482-mock-interview-duplicate-history branch May 18, 2026 06:03
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant