
백엔드
선착순 수강 신청 동시성 이슈
두줄요약
선착순 수강 신청의 정원 초과를 막기 위해 동시성 제어 방식을 비교했습니다. 조건부 원자적 UPDATE와 유니크 제약, 트랜잭션으로 정합성을 보장했습니다.
문제 상황
- 선착순 수강 신청에서 동시 요청이 몰리면 현재 인원을 동시에 읽어 정원 100명을 101명으로 초과할 수 있는 정합성 문제
- @Transactional만으로는 트랜잭션 간 동시 접근을 막지 못해 단순 조회 후 저장 방식에 한계 존재
원인 분석
- 여러 트랜잭션이 같은 currentCount를 읽고 같은 조건을 통과하는 경합 상황
- 중복 신청, 서버 다중화, 요청 집중 시점까지 함께 고려해야 하는 비즈니스 규칙
해결 방법
- 조건부 원자적 UPDATE로 정원 검증과 인원 증가를 하나의 DB 연산으로 처리
- student_id, course_id 유니크 제약 조건과 단일 트랜잭션으로 중복 신청 및 불일치 방지
성능/운영 포인트
- 여러 애플리케이션 서버 환경에서도 동일한 정원 규칙 적용 가능
- 별도 분산 락 없이 기존 데이터베이스 기능만으로 구현 가능
- 요청 집중 상황에서 락 경합보다 간결한 처리 구조 확보

