优惠券秒杀(超卖问题分析(乐观锁解决思路))
超卖问题(多线程):
想象一下线程1先查询数据库为1,然后卖出去了准备-1,在这期间有其他线程进来也查询库存(此时线程1进行扣减库存)所以查到的也是1,那么这这些线程都进行扣减库存操作(在这些个其他线程中他们的逻辑是没有问题的,但是我们的库存就一直在进行扣减操作了,出现了超卖)

逻辑有问题

解决思路:加锁(悲观锁还是乐观锁呢?乐观锁的性能更好点这里使用乐观锁)

1、!!!悲观锁:认为线程一定会出问题,所以在我们操作数据之前一定要先获取锁,确保线程串行执行咯(例如我们在多线程学到的排它锁啊:Synchronized还有Lock都是悲观锁)
2、!!!乐观锁:认为线程安全问题不一定发生,在操作数据之前不会直接给线程加锁,而是在修改完数据准备更新的时候去判断数据是否被修改过(判断数据是否被修改是重点哦)
其中判断没有被修改就认为是安全的,更新数据。判断被修改了,就不更新数据。重试或者抛出异常。
乐观锁操作:
注意:我们的乐观锁操作就是在更改库存的sql语句中在我们不仅要进行库存的扣减,版本号的+1更改,其中还有判断版本跟上面我们查询到的库存版本号和我们的数据的版本是否一致。
这样我们说下流程吧:

Cas方案(C:比较,A:and,s:select。先比较再修改)
!!!也就是优化版本号法(我们用库存来代替版本(我们前面查询的库存如果和我后面查询的库存一样那么一样证明这个库存没有被修改了,线程安全(修改库存)))
这里我们再说下流程吧:
