news 2026/4/3 2:53:32

优惠卷业务超卖问题解决方案

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
优惠卷业务超卖问题解决方案

问题背景

在在线教育业务中,因为功能的扩展刺激消费通常会有一个优惠卷的功能,当时这些优惠卷通常是限量的需要学员自助领取,在一些特定场景下会出现学员领取卷的总数量大于运营设置的卷的总数量,这就是超卖问题的现象,或许在这个创建下叫做“超领”可能更合适些。

产生原因

假设当前运营设置了10张优惠卷,前面9已经被抢完了,还是最后一张,但是此时有三个学员在相同时间下都做了领卷的操作,最终导致三个学员都领到卷了,导致领取总量大于发放总量。

解决方案

1.保证数据的原子性。添加发放总量 大于 以发放量的条件,保证多个在事务操作下数据的总量不会发生改变。

优点:代码改动量下,并且效果比较好,不会出现ABA的问题。(目前我们公司就是使用这个方案)

缺点:

  • 事务为了保证原子性,会在对这个优惠卷数据上行锁。
  • 在没有设置索引的时候可能会做全量扫描,效率上会变低。因此我们需要设置对应的有效索引防止走全表。
  • 在极端的情况下会更新失败,需要设置重试机制。当有多跟线程同时操作的时候,通过更新时回去行级锁来控制执行顺序,因为某些原因导致获取获取锁超时,最总导致更新失败。

2.悲观锁。通过synchronized对优惠卷id进行上锁,每次只有一个保证请求是串行的,执行速度比较慢,当时确实是最可靠的。

3.乐观锁。优点:保证了在请求的并行执行,在执行效率上是很高。

缺点:在请求大量的时候虽然都可以执行,但是最终只会有一个执行超过,在完成率上是比较低的。实现上通过版本号进行控制。在实现上是三者中最繁琐的。我们没有单独定义本号字段来做的,我们是使用更新时间做版本号的来实现的。

在极端情况下乐观锁会出现无法感知的超卖情况。但是对我们目前的业务场景不会造成影响。

极端的场景 (ABA):对总数不影响,导致可能会导致业务逻辑错误,保证数据的原子性就会存在这个问题。

时间线: 1. 线程A读到 version = 1, issued_count = 99 2. 线程B更新:issued_count = 100, version = 2 3. 线程C(退款)更新:issued_count = 99, version = 3 4. 线程A执行更新,version匹配成功!错误地认为数据没变
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/29 8:46:20

【独家披露】大厂都在用的Open-AutoGLM虚拟机集群部署架构设计

第一章:Open-AutoGLM虚拟机部署方案概述Open-AutoGLM 是一个基于开源大语言模型的自动化代码生成平台,支持在隔离的虚拟机环境中进行本地化部署,确保数据安全与系统稳定性。通过虚拟化技术,用户可在标准化环境中快速构建、测试和运…

作者头像 李华
网站建设 2026/3/29 8:08:53

亲测!山东高性价比AI公司靠谱推荐

亲测!山东高性价比AI公司靠谱推荐行业痛点分析当前山东AI公司领域面临着诸多技术挑战。数据表明,在AI营销获客方面,许多公司缺乏高效精准的解决方案,导致营销成本居高不下,转化率却难以提升。例如,传统的营…

作者头像 李华
网站建设 2026/3/31 2:45:26

揭秘Open-AutoGLM核心机制:5大关键技术让自动下单稳如泰山

第一章:揭秘Open-AutoGLM自动下单系统核心架构 Open-AutoGLM 是一个基于大语言模型驱动的自动化订单处理系统,融合了自然语言理解、智能决策与实时交易执行能力。其核心设计目标是实现从用户意图识别到订单生成的端到端自动化,同时保证高并发…

作者头像 李华
网站建设 2026/3/30 10:51:50

如何科学衡量软件测试的有效性

在敏捷开发与DevOps普及的当下,软件测试已从单纯的缺陷发现转向质量保障与业务价值交付的关键环节。对测试从业者而言,科学衡量测试有效性不仅是证明团队价值的基础,更是优化测试策略、提升ROI的重要依据。本文将围绕量化指标体系建设、过程质…

作者头像 李华
网站建设 2026/3/13 22:23:56

C++为什么推荐使用 make_shared 而不是 new 构造 shared_ptr?

大家好,我是小康。 C为什么推荐使用 make_shared 而不是 new 构造 shared_ptr? 看到这个问题,我想起了之前帮同事定位的一个线上bug。那是一个偶发的内存泄漏,最后追查发现就是因为不当使用 shared_ptr(new T()) 导致的异常安全问题。当时如果用了 make_shared,这…

作者头像 李华
网站建设 2026/4/1 15:43:42

揭秘Open-AutoGLM核心技术:如何实现毫秒级电商价格监控与自动决策

第一章:揭秘Open-AutoGLM核心技术:如何实现毫秒级电商价格监控与自动决策Open-AutoGLM 是一款专为高并发电商场景设计的智能监控与决策引擎,其核心基于轻量化图神经网络与实时流处理架构,能够在毫秒级响应商品价格波动并触发自动化…

作者头像 李华