开发者社区> 问答> 正文

各位老师好,想实现一个限定数量抢单功能,但存在的并发导致会超出数量限制,想问一下怎样的逻辑可以实现。

目前处理逻辑:
1、JS提交前校验活动表单上已预订份数大于等于可预订份数即报错:已售罄;
2、业务规则提交后新增对应活动表单上已预订份数+1;
3、集成自动化判断若已预订份数大于等于可订份数,则更新为已售罄。
实际测试过程中:仍会出现,限定1份,同时点击的两个人均可以通过的情况。
请问老师们有没有好的优化建议?

展开
收起
神说要有光678 2023-09-20 09:21:49 69 0
4 条回答
写回答
取消 提交回答
  • 十分耕耘,一定会有一分收获!

    楼主你好,多个用户同时抢购导致超卖问题,可能是因为您的处理逻辑存在竞态条件。根据您的处理逻辑,假如有两个以上的用户同时提交订单,可能导致超卖的问题。

    为了解决这个问题,您可以考虑以下优化策略:

    1. 使用乐观锁或悲观锁控制并发。乐观锁在提交更新时,先读取数据并保存版本号,然后在更新时检查版本号是否一致,若一致则更新数据并将版本号+1,否则返回错误。悲观锁则是在操作之前先锁定资源,操作完成后再释放锁。这样可以避免并发写入,保证数据的一致性和准确性。

    2. 使用分布式锁控制并发。可以使用Redis等分布式系统的锁机制,控制每个抢单操作的并发情况,避免并发问题。

    3. 优化处理逻辑。可以考虑在提交前,先查询当前剩余可预订数量,若数量已满则提示已售罄,避免并发更新导致超卖问题。

    2023-09-21 08:06:19
    赞同 展开评论 打赏
  • 面对过去,不要迷离;面对未来,不必彷徨;活在今天,你只要把自己完全展示给别人看。

    你的当前处理逻辑确实可以在前端和后端进行数量校验,但由于并发操作的存在,可能会导致超出限制的情况。为解决这个问题,可以考虑以下优化建议:

    1. 使用数据库事务:将对订单数量的增加操作放在一个数据库事务中。通过使用事务,在并发操作时可以保证数据的一致性和完整性。具体实现方式是在提交订单时,使用数据库事务锁定相关表或记录,防止其他用户并发修改已预订份数,从而避免超出限制。

    2. 使用分布式锁:引入分布式锁可以避免并发操作造成的数据不一致问题。当用户提交订单时,先获取分布式锁,然后再检查已预订份数是否超过可订购数量。如果符合条件,执行订单新增操作;否则,返回已售罄提示。该方法可以有效地控制并发操作,确保不会超出限制。

    3. 限制请求速率:在前端或后端添加请求速率限制,防止用户连续点击提交按钮导致过多的并发请求。可以设置一个时间间隔,在此时间内只允许一个请求通过,并拒绝其他请求。这样可以有效地控制并发操作的频率,减少超出限制的可能性。

    4. 提示实时更新:在前端界面上实时展示已预订份数的变化,给用户及时的反馈。例如,在提交订单后,可以通过异步请求获取最新的已预订份数,并在界面上显示出来,以避免多个用户同时看到还有余量的情况。

    2023-09-20 13:54:57
    赞同 展开评论 打赏
  • 为了解决并发导致超出数量限制的问题,可以考虑使用以下逻辑:

    1、在前端页面上添加一个限制按钮的点击次数的功能,例如每个用户只能点击一次按钮。
    2、在前端页面上添加一个限制按钮的点击时间间隔的功能,例如每个用户在一定时间内只能点击一次按钮。
    3、在后端数据库中添加一个锁机制,当一个用户点击按钮时,锁定该活动的可预订份数,直到该用户完成预订操作或超时。
    4、在后端数据库中添加一个活动表单的预订记录表,记录每个用户的预订操作,当一个用户点击按钮时,先查询该活动表单的预订记录表,如果已经有该用户的预订记录,则提示用户已经预订过了。
    5、在后端数据库中添加一个活动表单的预订状态表,记录每个活动表单的预订状态,当一个用户点击按钮时,先查询该活动表单的预订状态表,如果已经是已售罄状态,则提示用户已经售罄了。
    通过以上逻辑的优化,可以有效地避免并发导致超出数量限制的问题。

    2023-09-20 11:08:33
    赞同 展开评论 打赏
  • 十年摸盘键,代码未曾试。 今日码示君,谁有上云事。

    如果是单个服务器,最简单,加个lock就行了 如果涉及到多服务器,分布式,可以考虑用队列处理,把订单产生的消息放到消息队列里面,然后也是一个一个消费,这样就不会出现你说的脏数据超卖的现象。

    目前宜搭还没有开发出一套完整限定数量抢单功能的案例,关于如何解决高并发秒杀的超卖问题你可以参考一下链接:

    https://www.cnblogs.com/wenbochang/p/10912459.html

    2023-09-20 10:17:28
    赞同 1 展开评论 打赏
问答分类:
问答地址:
关联地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载