扣库存
高并发 因为原子性 超卖
select sockt_num where good_id = 1 先查询库存数量
if sockt_num > 2 {
update stock_num = stock_num - 2 where good_id = 1
}
悲观锁 性能下降
1 加锁 互斥,排它 先加锁,只有加锁成功的线程 ,才能执行,后面的线程排队
select sockt_num where good_id = 1 先查询库存数量
释放锁
乐观锁
T1 select stock_num ,version where good_id = 1
stock_num:10 ,version:0
if sockt_num > 2 {
update stock_num = stock_num - 2 ,version = version + 1
where good_id = 1 and version = version
}
T1 开始执行更新,发现version变成了1
更新失败,重新再查下
T2 select stock_num,version where good_id = 1
stock_num:10,version: 0
if(sock_num > 2){
update stock_num = stock_num - 2,version = version + 1;
where good_id = 1 and version = version //判断别的线程有没有改过banbenhao
T2 执行完,version变成了1
通过版本号,来区分,数据是否被修改过,如果没有修改过,直接更新,修改过,重新执行