分配过程将从使用实体框架的Web API(使用.Net)调用(rest api)。我考虑了以下两个解决方案:
选项1-让数据库处理
在分配点,我开始一个事务并获取用于评估库存可用性的两个表的独占锁。
该过程确认库存可用性,将单位分配给插槽,然后释放锁定。
我认为这将防止两个用户尝试将相同的唯一单元分配给两个不同的订单的竞争条件,但我对每个需要查询这些表的其他进程锁定两个表感到不舒服,直到分配过程完成,因为我认为这可能会导致其他尝试读取这些表的进程遇到瓶颈。在这种情况下,我认为尝试执行重复分配的第二个进程应排队等待第一个进程释放锁定,因为它无法查询可用性表,当它这样做时,它将失败,并报告缺货警告-因此有效地阻止第二个订单分配相同的库存。
在纸面上,这听起来很可行,但我有两个问题:第一个是它会影响性能,第二个是我可能忽略了某些东西。此外,我在这个项目中首次使用Postgres(我通常是SQL Server的人),但我认为Postgres仍然具有实现此功能的特性。选项2-使用某种手动锁定
我认为我的情况类似于售票网站在音乐会或电影销售过程中遇到的情况,我已经看到他们放置计时器,显示“您的门票将在5分钟后过期”,但我不知道他们如何在后端实现这种系统。他们是否创建一个“保留”库存表,然后在分配过程开始之前对其进行某种过期时间,并在那个计时器到期之前“黑名单”其他试图分配相同单位的用户?
抱歉介绍太长了,但我想完全解释问题,因为我看到过许多类似情况的问题,但没有什么真正帮助我决定如何继续的东西。
我的问题是,在这两个选项中,哪一个(如果有)是“正确的方法”来做到这一点?
编辑:我看到的与此问题最接近的是如何处理库存和并发,但它没有讨论选项1(可能是因为这是一个可怕的想法)。