update시 중복 업데이트 발생 가능여부 확인 부탁드립니다. 0 5 2,615

by lgxj20 [PL/SQL] [2023.06.30 15:40:19]


안녕하세요

새로운 업무를 하게되었는데 쿠폰을 미리 발행을 하고 고객번호를(회원가입시) 매칭하는데 문제가 생겨서 문의 드립니다.

일단 현재 업무로직이 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초를 걸어서 중복방지를 하게끔?? 한거 같습니다. 그런데 이게 문제를 발생시켜서

한번에 업데이트하는 걸로 수정하려는데 혹시 이렇게 수정하게 되면 혹시 같은 쿠폰에 업데이트가 되는 경우가 발생할지 문의 드립니다.

by 모래가흙흙 [2023.07.01 10:49:57]

여러사람이 같은 쿠폰 접근시 뒤쪽 트랜잭션들은 FOR UPDATE WAIT 5;  에 의해  5초 내에  LOCK이 풀리더라도  CLIENT쪽에 에러를 발생시키는 건가요?

 


by 우리집아찌 [2023.07.03 21:23:57]

다른세션이 접속 시도후 5초후 에러발생일겁니다. 

에러 받아서 고객이 사용중입니다?? 이런 메세지 출력해주면 될겁니다.


by 모래가흙흙 [2023.07.04 12:03:08]

아 그렇군요 감사합니다.


by 내일머하지 [2023.07.01 12:12:09]

저도 초보라 맞는지는 모르겠지만, where 조건에 서브쿼리를 하나 작성하고 그 안에 exist 조건을 넣어본는 건 어떨까요?


by 모래가흙흙 [2023.07.04 12:11:46]

먼저 개인적인생각은 아래를 먼저 검토할 것 같습니다.

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;

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입