news 2026/5/28 18:31:55

订单 30 分钟过期 + 临界支付 完整 Java 代码实战讲解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
订单 30 分钟过期 + 临界支付 完整 Java 代码实战讲解

目录

先定义核心场景

一、核心实体与常量

二、核心工具:Redis 分布式锁(解决并发竞态)

三、场景 1:订单自动过期任务(30 分钟触发)

代码逻辑(关键)

四、场景 2:用户支付接口(临界时刻核心处理)

代码逻辑(最关键)

五、场景 3:支付回调兜底(防止极端资损)

六、临界时刻(无限接近 30 分钟)代码执行结果

情况 1:支付请求先抢到锁

情况 2:过期任务先抢到锁

七、生产级优化:时间缓冲区(从源头避免临界)

八、代码核心总结(面试 + 实战通用)


本文用SpringBoot + Redis 分布式锁 + 延迟队列 (模拟) + 支付回调完整复现生产级代码,专门解决无限接近 30 分钟时支付的竞态问题。

先定义核心场景

  • 订单创建时间:createTime
  • 订单过期时间:expireTime = createTime + 30分钟
  • 临界问题:支付请求过期取消任务同时触发
  • 目标:绝对不允许:钱扣了,订单却取消;也不允许:订单取消了,还能支付成功

一、核心实体与常量

import lombok.Data; import java.time.LocalDateTime; // 订单实体 @Data public class Order { private String orderNo; // 订单号 private Integer status; // 0-待支付 1-已支付 2-已取消 private LocalDateTime createTime; private LocalDateTime expireTime; // 过期时间=创建+30分钟 } // 订单状态常量 interface OrderStatus { int WAIT_PAY = 0; // 待支付 int PAID = 1; // 已支付 int CANCELED = 2; // 已取消 }

二、核心工具:Redis 分布式锁(解决并发竞态)

作用:同一订单,支付和过期任务只能有一个先执行,从根本上杜绝冲突。 我们用Redisson(生产标准方案):

@Resource private RedissonClient redissonClient; // 获取订单锁:锁key=订单号,锁超时10秒(防止死锁) private RLock getOrderLock(String orderNo) { return redissonClient.getLock("ORDER_LOCK:" + orderNo); }

三、场景 1:订单自动过期任务(30 分钟触发)

代码逻辑(关键)

  1. 加分布式锁,只允许一个实例执行
  2. 二次校验:订单是否还是待支付 + 是否真的到过期时间
  3. 满足条件 → 改为已取消
/** * 订单过期取消任务(延迟队列30分钟后执行) */ public void orderExpireCancel(String orderNo) { RLock lock = getOrderLoc
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/28 18:24:17

实测!Chrome 104+ 开启H.265硬解后,不同显卡的播放效果与避坑指南

Chrome 104 H.265硬解实战:显卡性能横评与问题排查手册当你在4K显示器上点开一部HEVC编码的纪录片,却发现画面卡成PPT——这种体验足以毁掉整个周末下午。Chrome 104版本带来的H.265硬解支持本应是福音,但不同显卡的实际表现却像开盲盒。本文…

作者头像 李华
网站建设 2026/5/28 18:20:38

FPG平台:多维度评测平台透明度与稳定性

FPG平台:多维度评测平台透明度与稳定性在外汇服务行业持续规范化的背景下,用户选择平台时已不再只关注单一功能,而是更看重稳定运行、服务响应、风险提示和信息透明度等综合体验。FPG平台作为被不少用户关注的品牌,在整体评估中可…

作者头像 李华