주문 중복·재고 꼬임을 막는 “주문 트랜잭션 락(Transaction Lock) 처리” > 영카트5 팁자료실

영카트5 팁자료실

주문 중복·재고 꼬임을 막는 “주문 트랜잭션 락(Transaction Lock) 처리” 정보

주문 중복·재고 꼬임을 막는 “주문 트랜잭션 락(Transaction Lock) 처리”

본문

영카트5는 주문 버튼 클릭 시 네트워크 지연이나 사용자 연속 클릭, 모바일 환경의 재요청 등으로 인해 동일 주문이 중복 처리되거나 재고가 두 번 차감되는 문제가 발생할 수 있는 구조를 가지고 있습니다. 특히 타임세일·한정 수량 상품·트래픽 폭증 상황에서는 이 문제가 실제 장애로 이어지는 경우가 많습니다.

이를 방지하기 위해서는 주문 처리 구간에 트랜잭션 락(Transaction Lock)을 적용하여 ‘한 주문은 한 번만 처리’되도록 제어해야 합니다. 주문 시작 시 고유 토큰(주문 키)을 생성해 세션과 DB에 저장하고, 결제 완료 전까지 동일 토큰이 다시 처리되지 않도록 차단하는 방식입니다. 이 구조를 적용하면 중복 결제·중복 주문·재고 음수 현상을 원천적으로 막을 수 있습니다.

실무에서는 주문 처리 시작 부분(orderupdate.php)에서 주문 고유 키를 생성하고, 이미 처리된 키인지 먼저 확인합니다.

 

$order_key = md5($member['mb_id'].$_SERVER['REMOTE_ADDR'].time());

if (get_session('order_lock')) {
    alert('주문이 이미 처리 중입니다.');
}
set_session('order_lock', $order_key);
 

이후 결제 완료 시점에서 DB 트랜잭션을 사용해 주문 저장 → 재고 차감 → 결제 결과 반영을 하나의 묶음으로 처리합니다.

 

sql_query("START TRANSACTION");

sql_query("INSERT INTO g5_shop_order ...");
sql_query("UPDATE g5_shop_item SET it_stock_qty = it_stock_qty - 1 WHERE it_id = '$it_id'");

sql_query("COMMIT");
set_session('order_lock', '');
 

만약 중간에 오류가 발생하면 ROLLBACK 처리하여 데이터가 어긋나지 않도록 합니다. 이 방식은 서버 부하를 거의 늘리지 않으면서도 주문 안정성을 크게 향상시키며, 실제 운영 쇼핑몰에서는 장애 예방 효과가 매우 큰 핵심 고급 기법으로 평가됩니다. 특히 PG 연동, 모바일 결제, 세일 이벤트가 잦은 쇼핑몰에서는 필수적으로 적용하는 구조입니다.

추천
0

댓글 3개

저기 그냥 AI 에게 물어본거잖아요..

이중으로 재고 처리를 하는게 아니라 재고 1개인 상태의 주문을 동시에 했을경우 품절이슈 방지를 위해 그렇게 하는거에요..

 

아무리 포인트가 궁해도 이런글은 좀 자중해주셨으면 하네요..

세션 락은 “UX상 연타 방지” 정도지, 정합성 보장 장치가 아닙니다.
그리고 affected rows가 0이면 재고 부족으로 주문 실패 처리해야겠죠.

무슨 기능개선 성능개선으로 주절주절 올리는건 자유겠지만
최소한 영카트를 이해하고 올렸음하네요.

갑자기 이 글 보자마자 Idempotency key가 떠오르는 밤이군요. 이 글과는 상관없지만 서버쪽 손 놓은지 꽤 되었는데 왜 떠오르는지. 배운게 도둑질이라 그런가봅니다.
모두 편안한 밤되십시오.

전체 441
영카트5 팁자료실 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1402호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT