目录
一、超卖问题
1、背景
在如双11等购物需求剧增的背景下,一个物品库存里有100件但是由于并发等问题可能会导致该物品被卖出超过100件。这就是超卖问题,他是由于库存量被高并发请求而产生的线程安全问题。
2、产生原因以及线程安全问题
当库存仅为1的时候,此时由于并发量高多个线程进行库存查询操作,此时这些线程都查询到库存为1,都各自去进行后续下单扣减库存的操作,此时库存被扣减多次成为负数,产生超卖问题,也就是线程安全问题
3、解决
对于上述超卖的线程安全问题我们可以采用两种方式来解决
1.悲观锁
首先悲观锁的概念是他认为一定会产生线程安全问题所以采用直接加锁的方法,我们此处可以对伤处库存查询于库存扣减操作加锁来处理,但是加锁也要注意防止锁释放了其他线程获取到了锁,但是之前的事务还没有提交,这又会产生新的问题,下面会提到。
2.乐观锁
版本号:
乐观锁的方式我们可以通过给库存来加一个版本号,当线程1与线程2同时读取到库存都为1时,此时版本号也为1,线程1进行了扣减库存操作修改数据库时,加版本号判断的条件:数据库里版本号与上面查询库存时的版本号相同则修改成功,此时线程1修改时数据库中版本号为1,上面查询库存时版本号也为1则修改成功,这个时候线程2也进行扣减库存操作,当他去修改数据库时,发现他在查询库存时的版本号为1,但是数据库中由于线程1已经修改版本号为2,此时线程2则不能扣减成功。
CAS:
我们也可以采用CAS的办法,线程1与2查询库存都为1&#x