php解决并发库存问题


一:问题
数据库处理sql是一条条处理的,假设购买商品的流程是这样的

sql1:查询商品库存
if(库存数量 > 0){
    //生成订单...
    sql2:库存-1
}

当没有并发时,上面的流程看起来是如此完美,假设同时两个人下单,而库存只有1个了,在sql1阶段两个人查询到的库存都是>0的,于是最终都执行了sql2,库存最后变为-1,超售了,要么补库存,要么等用户投诉吧。
解决这个问题比较好的方法是什么呢?


mysql 共享锁和排它锁


一:mysql锁机制分为表级锁和行级锁,行级锁里面又有共享锁和排他锁。

注意表的引擎类型要使用INNODB
表级:引擎 MyISAM , 理解为锁住整个表,可以同时读,写不行
行级:引擎 INNODB ,单独的一行记录加锁