fix - 事务&锁机制优化,防止重复扣费情况。

This commit is contained in:
2026-06-07 08:06:24 +08:00
parent 703e17c3bc
commit 279ed6825b

View File

@@ -24,7 +24,11 @@ import org.apache.commons.lang3.time.DateFormatUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.support.DefaultTransactionDefinition;
import org.springframework.web.bind.annotation.RequestBody;
import javax.annotation.Resource;
@@ -69,6 +73,9 @@ public class OrderService extends BaseServiceImpl {
@Resource
private MemberKeyLock memberKeyLock;
@Resource
private PlatformTransactionManager transactionManager;
/**
* 创建订单
*
@@ -314,17 +321,30 @@ public class OrderService extends BaseServiceImpl {
return result;
}
Order order = new Order();
order.setOrderSn(createSn());
order.setPayType(payTypeEnum.value);
order.setPrice(price);
order.setPayStatus(PayStatusEnum.NOT_PAY.value);
order.setType(OrderTypeEnum.BASKETBALL_ORDER.value);
order.setPlatformId(venue.getPlatformId());
order.setMemberId(memberId);
order.setParentOrderId(venueId);
order.setCreatedId(enterFlag);
orderMapper.insert(order);
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
TransactionStatus txStatus = transactionManager.getTransaction(def);
Order order;
try {
order = orderMapper.findPendingBasketballOrder(memberId, venueId);
if (order == null) {
order = new Order();
order.setOrderSn(createSn());
order.setPayType(payTypeEnum.value);
order.setPrice(price);
order.setPayStatus(PayStatusEnum.NOT_PAY.value);
order.setType(OrderTypeEnum.BASKETBALL_ORDER.value);
order.setPlatformId(venue.getPlatformId());
order.setMemberId(memberId);
order.setParentOrderId(venueId);
order.setCreatedId(enterFlag);
orderMapper.insert(order);
}
transactionManager.commit(txStatus);
} catch (RuntimeException e) {
transactionManager.rollback(txStatus);
throw e;
}
if (EnterEnum.OUT.value == enterFlag) {
BarcodeOrderTime lastOrder = barcodeOrderTimeMapper.findLastOrder(memberId, venueId);