1

我正在构建一个简单的购物车。目前,为了确保客户永远不会购买缺货的产品,在处理订单时,我对他们购物车中的每个产品都有一个循环:

-- 开始交易 -- 遍历购物车中的每个产品,然后

  1. 从产品表中选择库存数量

如果有现货:

  • 我将减少产品的库存数量
  • 将产品添加到订单项目表

否则,我调用回滚并返回错误

--(如果没有要求回滚,一切都以提交结束--

但是,如果在任何给定时间,产品的库存计数在检查该特定产品后更新,则可能存在不一致。

问题:每当我处理订单时,锁定表以防写入是个好主意吗?因此,当上述“循环”发生时,我可以确信没有其他人能够更改产品数量,并且它始终是准确的。

这个想法是产品数量/可用性将始终保持一致,并且永远不会出现库存数量变为 -1 的情况(这将是无法实现的)。

但是,我看到很多关于锁效率低下/效果不佳的帖子。如果是这样,实现这一目标的最佳方法是什么?

我已经看到了在更新 + 选择查询中处理它的替代方法,但也看到它在某些情况下也可能不适合。

4

1 回答 1

1

你至少有三个策略:

1.悲观锁定

如果您的应用程序活动较少,那么您可以锁定表(或单行)以确保在处理购买期间没有其他线程更改值。它可以工作,但它有性能限制。

2. 乐观锁定

如果您的应用程序/网站必须服务于高负载,那么您可以选择“乐观锁定”策略。在这种情况下,您将版本号列添加到关键表中,然后在读取/写入时使用它。

更新库存时,您检查要更新的版本号必须与您阅读的版本号相同。如果不再是这种情况(另一个线程对其进行了修改),则回滚事务并可以重试几次,直到成功。

它需要更多的开发工作,因为您需要识别不良情况并实施重试逻辑(如果您愿意)。

3. 处理队列

您可以实现处理队列。当一个线程想要“购买一个订单”时,它可以将它提交到一个处理队列来处理购买订单。这个队列可以由一个或多个专用于该任务的线程来实现;如果您选择多个线程,它们可以按订单类型、区域、类别等进行划分,以分配负载。

这需要更多的编程工作,因为您需要管理异步处理,但可以承受更高级别的负载。

您可以将此策略用于多种不同的任务:采购订单、补充库存、发送通知、处理促销等。

于 2020-06-26T03:27:23.423 回答