商城业务如何增加或者减少库存

库存的变化是原子性的,如果在更新的库存的时候没有考虑好如何更新库存,那么会导致库存的 重复修改、脏读、幻读、不可重复读等操作。

但如果加锁的粒度过于大的话,就会导致大量的更新库存的请求失败。无法支持高并发的。

那么该怎么样写合适代码来更新库存呢?

其实核心思想是:

1. 加事务

2. 查询更新

先看下导致重复修改的代码:

 

 虽然这个方法是加了事务,然而事务在执行的过程中,只能保证事务的独立性,但是在更新库存的时候,还是造成了重复写入的错误。

接着看下,第一版本的优化:

 第一版的优化方法是对每个skuId加了一个锁,保证同一时刻对某一sku_id的操作是唯一的,但是这种方法无法支持高并发,对一个高并发的网站来说不是一个很好的选择。

再看下第二版本的优化:

 这个版本的优化是在执行更新操作的时候,比较一下skuId的库存数是不是和原先的一样,如果一样的话就更新,如果不一样的话就更新失败。

我们这样想,同时有10个请求进来,对数据库进行操作。第一个请求更新完库存后,其他9个请求去校验库存,库存校验这个时候一定是失败的,这样会导致另外9的请求的更新库存是失败的。

最后再看下最终版本的解决方法:

 最后的方法是将判断库存是不是足够,以及增加库存的语句放到了一个sql里,这样的话,每个事务在执行的时候只需要判断,库存是不是足够就行了。并不会影响每个事务的更新操作。

原文地址:https://www.cnblogs.com/cjjjj/p/12602459.html