선

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

· 2025-12-17 (수) 09:17:37 · 1481 · 3

영카트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 연동, 모바일 결제, 세일 이벤트가 잦은 쇼핑몰에서는 필수적으로 적용하는 구조입니다.

|

댓글 3개

2025-12-17 (수) 21:22:25

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

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

 

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

2025-12-19 (금) 04:19:19

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

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

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

댓글을 작성하시려면 로그인이 필요합니다.

영카트5 팁자료실

455건
+
제목 글쓴이 날짜 조회
05-20 조회 261
04-22 조회 464
04-14 조회 401
03-22 조회 518
03-21 조회 559
02-26 조회 675
02-21 조회 932
02-20 조회 727
02-19 조회 750
02-17 조회 1,282
02-13 조회 1,300
02-13 조회 790
02-03 조회 947
01-29 조회 1,173
25-12-17 조회 1,482
25-12-07 조회 1,416
25-11-30 조회 1,497
25-11-15 조회 1,693
25-10-26 조회 1,863
25-10-25 조회 1,433
25-10-14 조회 1,694
25-10-11 조회 1,745
25-10-10 조회 1,567
25-10-05 조회 2,184
25-10-01 조회 1,693
25-09-25 조회 1,773
25-09-21 조회 1,579
25-09-19 조회 1,535
25-09-09 조회 1,759
25-09-03 조회 1,774