본문으로 건너뛰기

환불완료 주문 상태 정합성 개선

PHP 8 · GODO26
변경 파일 수: 2개
변경 파일 목록
총 2개
변경 파일 코드
추가삭제
Component/Order/OrderAdminNew.php+10-2
변경 전OrderAdminNew.php
}
 
// 환불완료/취소/실패인 경우 무조건 상태변경 금지
if ($val['orderStatus'] == 'r3' || $val['orderStatus'] == 'c' || $val['orderStatus'] == 'f') {
if($channel != 'naverpay') {
 
 
 
 
 
 
 
 
$changeStatusCheck = false;
 
if ($changeStatus === 'r3') {
 
변경 후OrderAdminNew.php
}
 
// 환불완료/취소/실패인 경우 무조건 상태변경 금지
// 스냅샷($val)뿐 아니라 FOR UPDATE 잠금조회로 최신 상태까지 확인해 배치 중 커밋된 환불완료(r3) 덮어쓰기 방지
if ($channel != 'naverpay') {
$lockBind = [];
$this->db->bind_param_push($lockBind, 'i', $val['sno']);
$this->db->bind_param_push($lockBind, 's', $orderNo);
$lockedOrderGoods = $this->db->query_fetch('SELECT orderStatus FROM ' . DB_ORDER_GOODS . ' WHERE sno = ? AND orderNo = ? FOR UPDATE', $lockBind, false);
$currentOrderStatus = $lockedOrderGoods['orderStatus'] ?? $val['orderStatus'];
 
if (in_array($val['orderStatus'], ['r3', 'c', 'f'], true)
|| in_array($currentOrderStatus, ['r3', 'c', 'f'], true)) {
$changeStatusCheck = false;
 
if ($changeStatus === 'r3') {
 
Component/Order/OrderAdmin.php+7-2
변경 전OrderAdmin.php
$changeStatusCheck = false;
}
} else {
// 실제 주문상품의 주문상태
$orderGoodsStatus = $this->getOrderGoods($orderNo,$val['sno'])[0]['orderStatus'];
 
 
 
 
 
 
if ($changeStatus === 'r3') {
$this->setCommonLog(
 
변경 후OrderAdmin.php
$changeStatusCheck = false;
}
} else {
// 실제 주문상품의 주문상태 배치 트랜잭션 스냅샷(REPEATABLE READ)에 가려진 환불완료(r3)를 놓치지 않도록
// FOR UPDATE 잠금조회로 최신 커밋 상태 재조회 (덮어쓰기 방지)
$lockBind = [];
$this->db->bind_param_push($lockBind, 'i', $val['sno']);
$this->db->bind_param_push($lockBind, 's', $orderNo);
$lockedOrderGoods = $this->db->query_fetch('SELECT orderStatus FROM ' . DB_ORDER_GOODS . ' WHERE sno = ? AND orderNo = ? FOR UPDATE', $lockBind, false);
$orderGoodsStatus = $lockedOrderGoods['orderStatus'] ?? $val['orderStatus'];
 
if ($changeStatus === 'r3') {
$this->setCommonLog(