From 8efd16ba56c794d36ca512cf720b6d8af90eeaaa Mon Sep 17 00:00:00 2001 From: Jerry Yan <792602257@qq.com> Date: Mon, 17 Nov 2025 08:52:00 +0800 Subject: [PATCH] =?UTF-8?q?fix(coupon):=20=E4=BC=98=E5=8C=96=E4=BA=8B?= =?UTF-8?q?=E5=8A=A1=E5=9B=9E=E6=BB=9A=E6=A0=87=E8=AE=B0=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 添加对无事务上下文情况的处理 - 避免在非事务环境下抛出异常 - 提高优惠券领取失败时的系统稳定性 --- .../pricing/service/impl/CouponServiceImpl.java | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/ycwl/basic/pricing/service/impl/CouponServiceImpl.java b/src/main/java/com/ycwl/basic/pricing/service/impl/CouponServiceImpl.java index e9d0e15f..1130f302 100644 --- a/src/main/java/com/ycwl/basic/pricing/service/impl/CouponServiceImpl.java +++ b/src/main/java/com/ycwl/basic/pricing/service/impl/CouponServiceImpl.java @@ -17,6 +17,7 @@ import lombok.RequiredArgsConstructor; import java.util.Date; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import org.springframework.transaction.NoTransactionException; import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.interceptor.TransactionAspectSupport; @@ -292,7 +293,7 @@ public class CouponServiceImpl implements ICouponService { return CouponClaimResult.success(claimRecord, coupon); } catch (CouponInvalidException e) { - TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); + markRollbackOnly(); log.warn("领取优惠券失败(业务校验不通过): userId={}, couponId={}, reason={}", request.getUserId(), request.getCouponId(), e.getMessage()); String errorCode = e.getErrorCode() == null @@ -300,10 +301,18 @@ public class CouponServiceImpl implements ICouponService { : e.getErrorCode(); return CouponClaimResult.failure(errorCode, e.getMessage()); } catch (Exception e) { - TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); + markRollbackOnly(); log.error("领取优惠券失败: userId={}, couponId={}", request.getUserId(), request.getCouponId(), e); return CouponClaimResult.failure(CouponClaimResult.ERROR_SYSTEM_ERROR, "系统错误,领取失败:" + e.getMessage()); } } + + private void markRollbackOnly() { + try { + TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); + } catch (NoTransactionException ex) { + log.debug("未检测到Spring事务上下文,跳过回滚标记"); + } + } }