Answers:
这个问题没有完美的答案,而且都取决于细节。
作为第一道“防线”,我将尽量避免出现这种情况,方法是根本不出售任何可能的低价物品。如果可能,则取决于情况和要出售的物品的种类。在我工作的公司中,大多数文章都是在网站缺货之前从网站上删除的。但我们出售的是整笔交易,剩下的几件商品则由我们的销售人员作为特价出售。对于小型商店,这可能不是一个选择,尤其是在出售高价商品时。
在向篮子里添加东西时进行仔细检查的解决方案不是很好。人们在没有实际下订单的情况下将很多东西放在篮子里。因此,这可能会在一段时间内阻塞本文。
因此,以我对小型工作的拙见,最好的方法是在实际下订单时在付款前做最后检查。在最坏的情况下,您必须告诉客户您现在缺货了(小型商店很少会发生这种情况)。
我认为最佳做法是选择以下哪个选项更适合特定的业务案例:
“悲观的脱机锁假定会话冲突的可能性很高,因此限制了系统的并发性,而乐观的脱机锁假定冲突的可能性很低。对会话冲突的期望不太可能允许多个用户使用相同的数据同时进行。”与往常一样,这取决于您的要求。如果您是亚马逊公司,每天售出100,000,000件商品,那么抢先检查和锁定的开销可能是令人望而却步的,而每天一位顾客毕竟没有得到他们的商品的问题可以忽略不计。如果您交易的是独特而昂贵的稀有古董宗教图标,则可能恰恰相反。您自己必须知道您的业务案例在该范围内的位置。
在我们的例子中,我们使用消息队列来处理订单并将其配置为仅以FIFO方式一次只处理同一产品上的一个作业。
需要注意的是,您要在整个订购过程中增加新的开销,这会延迟一些时间。
对于用户而言,最佳实践显然是确保第二次添加失败。但是,由于0.1%的情况,这会使您的整个网站变慢。
技术上最有效的解决方案,也是使销售最大化的解决方案,是让它成功,然后稍后再履行两个订单-只是因为您现在没有库存,并不意味着您找不到它在紧急情况下。如果您不能这样做,那么有人必须联系幸运的用户并道歉。但这正是导致今年圣诞节前引起轩然大波的原因(这不是唯一出现的文章,因此对百思买表示歉意,但这是我发现的第一篇)。
您的工作是向企业介绍所有方案,并取其优点和缺点,然后让它们根据您的建议进行决策。如果他们偶尔能为声誉带来一点点损失,以使销售最大化,那么就足够公平了;如果他们做不到,而且流量太低,以至于您可以快速检查两次更新,那也是他们的要求。