在购买商品的过程中,库存扣除过程的一般操作如下:
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