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