선착순 랜덤 쿠폰 발급 시스템 구조
MySQL 기반
- 관리자
- 쿠폰 생성 (TABLE c)
- 쿠폰 바구니에 쿠폰 넣기 (TABLE cb as cb1)
-
A 쿠폰 98개 , B쿠폰 2개 = 총 100rows 삽입
- 사용자
- 접근시 쿠폰 남은 갯수 체크 (TABLE cb)
-
남은것이 없다면 쿠폰 발급 불가 표시
- 쿠폰 발급
- 쿠폰 바구니에서 row 1개에 대해서 회원 번호를 넣는다. (TABLE cb) (update) (order by rand())(limit 1)
- 쿠폰이 남아있든 안 남아있든 실행한다.(밑의 발급 안된 쿠폰이 없으면 update되는게 없을 것이므로)
- update 쿼리에서 발급 안된 쿠폰만 사용하도록 한다.
-
목적 : 이미 발급된 쿠폰은 무시하게, 쿠폰 갯수 초과하지 않도록
- 필요하다면 중복 당첨 제어도 where에 넣어서 처리한다.
- not exists (select ‘x’ from cb cb2 wherec cb2.cb_idx = cb1.cb_idx and cb2.member_idx = {사용자번호} )
-
처럼 where에 추가.
- 쿠폰 바구니에서 사용자의 회원 번호로 select 한다.
- 없다면 쿠폰 발급이 안된 사용자
- 있다면 쿠폰 발급 완료된 사용자
-
쿠폰 후처리
- 끝
위처럼 만든 목적은
- 갯수 필드로만 할 경우 SELECT의 갭에 의한 과 발급 방지
- 랜덤 발급 가능
- 당첨자 명시화
등등 때문에… 아예 row를 뽑아내서 사용했음.
반성 갯수 필드 만으로도 가능할 것 같다. update처리할 때 조건으로 남은 갯수를 체크하면 될테니깐.(아마 락 잡겠지??) 다만 이럴 경우 당첨자 명시화가 힘들다. 즉, 다시 당첨자 row를 기록하는 테이블이 생겨야함. 즉, 미리 만들어 놓고 update 하는거나, 할 때 insert 하는거나.. 그리고 중복 당첨자 처리도…