diff --git a/shop/ajax.coupondownload.php b/shop/ajax.coupondownload.php index e827cc410..bf4870657 100644 --- a/shop/ajax.coupondownload.php +++ b/shop/ajax.coupondownload.php @@ -19,7 +19,8 @@ if(!($cp['cz_start'] <= G5_TIME_YMD && $cp['cz_end'] >= G5_TIME_YMD)) die(json_encode(array('error' => '다운로드할 수 없는 쿠폰입니다.'))); // 동시 요청으로 인한 쿠폰 중복 발급 방지 -$lock_key = 'g5_coupon_dl_'.$cz_id.'_'.addslashes($member['mb_id']); +// 포인트는 회원 단위 자원이므로 쿠폰이 달라도 같은 회원의 요청은 직렬화한다. +$lock_key = 'g5_coupon_dl_'.addslashes($member['mb_id']); $lock_row = sql_fetch(" select get_lock('$lock_key', 5) as lk "); if(empty($lock_row['lk'])) die(json_encode(array('error' => '잠시 후 다시 시도해 주십시오.'))); @@ -30,10 +31,14 @@ if(is_coupon_downloaded($member['mb_id'], $cp['cz_id'])) { die(json_encode(array('error' => '이미 다운로드하신 쿠폰입니다.'))); } -// 포인트 쿠폰은 회원포인트 체크 -if($cp['cz_type'] && ($member['mb_point'] - $cp['cz_point']) < 0) { - sql_query(" do release_lock('$lock_key') "); - die(json_encode(array('error' => '보유하신 포인트가 부족하여 쿠폰을 다운로드할 수 없습니다.'))); +// 포인트 쿠폰은 회원포인트 체크 (락 획득 후 최신 잔액으로 재확인) +if($cp['cz_type']) { + $row_pt = sql_fetch(" select mb_point from {$g5['member_table']} where mb_id = '{$member['mb_id']}' "); + + if(($row_pt['mb_point'] - $cp['cz_point']) < 0) { + sql_query(" do release_lock('$lock_key') "); + die(json_encode(array('error' => '보유하신 포인트가 부족하여 쿠폰을 다운로드할 수 없습니다.'))); + } } // 쿠폰발급