안녕하세요
새로운 업무를 하게되었는데 쿠폰을 미리 발행을 하고 고객번호를(회원가입시) 매칭하는데 문제가 생겨서 문의 드립니다.
일단 현재 업무로직이 1.쿠폰번호를 가져옴 - > 2가져온 쿠폰번호에 고객번호를 업데이트 -> 3 업데이트후 조회해서 문자 테이블insert 처리
1. 쿠폰번호 가져온다
SELECT CPON_NO
FROM CSCOUPON A
WHERE COMP_CD = 'NG001'
AND CPON_TP = 'CPON'
AND EV_NO = '220304-0002'
AND USE_YN = 'N'
AND CUS_NO_INNER IS NULL <-- 쿠폰중에 고객번호와 매칭 안된조건
AND ROWNUM = 1;
FOR UPDATE WAIT 5; <-- 중복쿠폰 발생 못하게 처리한거 같음.
2. 1번에서 가져온 쿠폰번호에 고객번호를 업데이트한다
UPDATE cscoupon
SET cus_no_inner = '1059-0608-211223',
issue_dt = TO_CHAR(SYSDATE, 'YYYYMMDD'),
exp_dt = TO_CHAR(ADD_MONTHS(SYSDATE, +1), 'YYYYMMDD'),
updt_id = 'SSS',
updt_dt = SYSDATE
WHERE comp_cd = 'NG001'
AND cpon_no = CPON_NO <-- 1버에서 가져온 쿠폰번호
3. 문자 테이블에 해당 정보를 INSERT 한다.
이렇게 했을때 한번에 10명이상 고객이 해당 건을 요청하게 되면 DB가 문제가 발생하는거 같습니다.
그래서 생각한게
1. 한번에 업데이트를 하고
UPDATE cscoupon
SET cus_no_inner = '1059-0608-211223', <-- 고객번호
issue_dt = TO_CHAR(SYSDATE, 'YYYYMMDD'),
exp_dt = TO_CHAR(ADD_MONTHS(SYSDATE, +1), 'YYYYMMDD'),
updt_id = 'SSS',
updt_dt = SYSDATE
WHERE comp_cd = 'NG001'
AND cpon_no = CPON_NO
CPON_NO
FROM CSCOUPON A
WHERE COMP_CD = 'NG001'
AND CPON_TP = 'CPON'
AND EV_NO = '220304-0002'
AND USE_YN = 'N'
AND CUS_NO_INNER IS NULL
AND ROWNUM = 1);
2 .고객번호를 가지고 문자테이블에 INSERT 한다
이렇게 수정을 하려고하는데요
여기서 혹시 문제가 된 SQL에서는 FOR UPDATE WAIT 5초를 걸어서 중복방지를 하게끔?? 한거 같습니다. 그런데 이게 문제를 발생시켜서
한번에 업데이트하는 걸로 수정하려는데 혹시 이렇게 수정하게 되면 혹시 같은 쿠폰에 업데이트가 되는 경우가 발생할지 문의 드립니다.
먼저 개인적인생각은 아래를 먼저 검토할 것 같습니다.
1. 쿠폰번호를 랜덤하게 건 가져온다.
--1건의 결과가 문제 될 정도로 오래걸리면 다른방법을 검토
SELECT CPON_NO
FROM
(SELECT CPON_NO
FROM CSCOUPON A
WHERE ...
AND CUS_NO_INNER IS NULL
ORDER BY DBMS_RANDOM.VALUE)
WHERE ROWNUM <= 1;
2. 위에서는 FOR UPDATE문을 사용할 수 없으므로 가져온 쿠폰번호를 가지고 다시 FOR UPDATE문을 사용한다.
SELECT CPON_NO
FROM CSCOUPON
WHERE CPON_NO = :V_CPON_NO
AND CUS_NO_INNER IS NULL
FOR UPDATE WAIT 5;