目前处理逻辑:
1、JS提交前校验活动表单上已预订份数大于等于可预订份数即报错:已售罄;
2、业务规则提交后新增对应活动表单上已预订份数+1;
3、集成自动化判断若已预订份数大于等于可订份数,则更新为已售罄。
实际测试过程中:仍会出现,限定1份,同时点击的两个人均可以通过的情况。
请问老师们有没有好的优化建议?
楼主你好,多个用户同时抢购导致超卖问题,可能是因为您的处理逻辑存在竞态条件。根据您的处理逻辑,假如有两个以上的用户同时提交订单,可能导致超卖的问题。
为了解决这个问题,您可以考虑以下优化策略:
使用乐观锁或悲观锁控制并发。乐观锁在提交更新时,先读取数据并保存版本号,然后在更新时检查版本号是否一致,若一致则更新数据并将版本号+1,否则返回错误。悲观锁则是在操作之前先锁定资源,操作完成后再释放锁。这样可以避免并发写入,保证数据的一致性和准确性。
使用分布式锁控制并发。可以使用Redis等分布式系统的锁机制,控制每个抢单操作的并发情况,避免并发问题。
优化处理逻辑。可以考虑在提交前,先查询当前剩余可预订数量,若数量已满则提示已售罄,避免并发更新导致超卖问题。
你的当前处理逻辑确实可以在前端和后端进行数量校验,但由于并发操作的存在,可能会导致超出限制的情况。为解决这个问题,可以考虑以下优化建议:
使用数据库事务:将对订单数量的增加操作放在一个数据库事务中。通过使用事务,在并发操作时可以保证数据的一致性和完整性。具体实现方式是在提交订单时,使用数据库事务锁定相关表或记录,防止其他用户并发修改已预订份数,从而避免超出限制。
使用分布式锁:引入分布式锁可以避免并发操作造成的数据不一致问题。当用户提交订单时,先获取分布式锁,然后再检查已预订份数是否超过可订购数量。如果符合条件,执行订单新增操作;否则,返回已售罄提示。该方法可以有效地控制并发操作,确保不会超出限制。
限制请求速率:在前端或后端添加请求速率限制,防止用户连续点击提交按钮导致过多的并发请求。可以设置一个时间间隔,在此时间内只允许一个请求通过,并拒绝其他请求。这样可以有效地控制并发操作的频率,减少超出限制的可能性。
提示实时更新:在前端界面上实时展示已预订份数的变化,给用户及时的反馈。例如,在提交订单后,可以通过异步请求获取最新的已预订份数,并在界面上显示出来,以避免多个用户同时看到还有余量的情况。
为了解决并发导致超出数量限制的问题,可以考虑使用以下逻辑:
1、在前端页面上添加一个限制按钮的点击次数的功能,例如每个用户只能点击一次按钮。
2、在前端页面上添加一个限制按钮的点击时间间隔的功能,例如每个用户在一定时间内只能点击一次按钮。
3、在后端数据库中添加一个锁机制,当一个用户点击按钮时,锁定该活动的可预订份数,直到该用户完成预订操作或超时。
4、在后端数据库中添加一个活动表单的预订记录表,记录每个用户的预订操作,当一个用户点击按钮时,先查询该活动表单的预订记录表,如果已经有该用户的预订记录,则提示用户已经预订过了。
5、在后端数据库中添加一个活动表单的预订状态表,记录每个活动表单的预订状态,当一个用户点击按钮时,先查询该活动表单的预订状态表,如果已经是已售罄状态,则提示用户已经售罄了。
通过以上逻辑的优化,可以有效地避免并发导致超出数量限制的问题。
如果是单个服务器,最简单,加个lock就行了 如果涉及到多服务器,分布式,可以考虑用队列处理,把订单产生的消息放到消息队列里面,然后也是一个一个消费,这样就不会出现你说的脏数据超卖的现象。
目前宜搭还没有开发出一套完整限定数量抢单功能的案例,关于如何解决高并发秒杀的超卖问题你可以参考一下链接:
https://www.cnblogs.com/wenbochang/p/10912459.html
。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。