当前位置: 首页 > 网络应用技术

如何防止超额商品清单的扣除过程?

时间:2023-03-08 16:10:18 网络应用技术

  在购买商品的过程中,库存扣除过程的一般操作如下:

  1.根据产品ID选择产品的库存。

  2.根据订单数量,库存就足够了。如果存储库不足,则库存不足。如果库存足够,则扣除的库存将减少以获得最新的库存剩余价值。

  3.设置最新的库存剩余值。

  上述过程的伪代码如下:

  并发修改数据库超卖

  如果数据库交易的隔离水平不可序列化,则根据交易的特征,在同时修改过程中可能会出现写入覆盖率的问题。

  假设产品剩余的库存为100_将,客户A下达订单20,而客户b下达订单30.当库存清单时,可能会超售。如果客户A和客户b获取剩余的库存同一时间,交易后提交的价值将涵盖以前客户提交的价值,其余库存可能为80或70。

  该过程如下:

  锁更新存款库

  为了防止交易控制中的写入覆盖范围,您将考虑使用Select进行更新来锁定产品的清单,然后执行其余操作。

  该过程如下:

  以上,使用悲观的锁在分布式服务中,如果并发情况相对较高,则扣除库存的操作是串行操作,这是非常有效的。

  用乐观的锁更新

  在更新时,库存使用最佳锁(CAS+版本编号更新)+重试条件(重试时间次数或重试时间的时间限制)。100个库存同时,当更新时,一个操作将失败。

  该过程如下:

  该方法可以大大提高并发性并确保数据的一致性;通过试验数量和重试时间的条件控制,它可以防止重试太多的数据库压力。

  可以以减少的方式执行吗?

  扣除库存时,有些人建议他们不执行选择,计算,设置三个阶段操作,直接扣除扣除方法,并判断扣除额的情况小于零。伪代码如下:

  在分布式服务调用中,由于网络异常和获得服务器异常,在调用微服务调用时可能会重试服务。对性和其他性不满意,并且有多种扣除。例如,当同一用户扣除库存时,将检索该服务。在极端情况下,用户多次扣除库存操作,并且商品超额出售。

  我可以将Redis用于库存扣除吗?

  由于尚未研究REDIS源代码,指的是Daniel对这种方式的答复,因此答案是您可以使用Redis的交易扣除余额,但是CAS机构没有比MySQL的优势。丢失数据的风险。

  链接:https://blog.csdn.net/new_com/article/details/105568124