1 悲观锁解决方案
悲观锁,也就是在修改数据的时候,采用锁定状态,排斥外部请求的修改。遇到加锁的状态,就必须等待。可以采用redis队列+mysql事务控制的方案,下面是流程图:
mysql的执行代码:
beginTranse(开启事务)
try{
//quantity为请求减掉的库存数量
$dbca->query('update s_store set amount = amount - quantity where postID = 12345');
$result = $dbca->query('select amount from s_store where postID = 12345');
if(result->amount < 0){
throw new Exception('库存不足');
}
}catch($e Exception){
rollBack(回滚)
}
commit(提交事务)
先执行update锁住本条记录,这样就能保证其他线程执行不了更新操作,可以避免超扣现象。
上述的方案的确解决了线程安全的问题,但是,别忘记,我们的场景是“高并发”。也就是说