重复点击导致超卖

问题描述

  说来奇怪,这个问题的发现是一个非常偶然的情况

  因为鼠标问题,点击一次,触发了两次,导致了并发,比如只有三件库存,快速点击两次生成了两条记录,但是库存缺只减少了一个,

  为了复现这个问题,使用我单身20年的手速,尝试了很多次才会有一次并发问题出现

  起初遇到这个问题时,想的是为什么库存只减少了一个,应该是减少两个才对,难道是数据表只更新了一次,后来才明白,商品表更新了两次,只是因为两次的操作都是将3更新为2

问题解决

  首先前端更新版本做了限制,重复点击只会调用一次接口

  后端使用乐观锁

  因为PHP框架使用的是yii2,所以乐观锁加起来也比较方便,首先在对应的商品表中增加版本号字段 如 version 类型为整型

  然后重写 

 public function optimisticLock()
    {
        return 'version';
    }

  返回值为自己定义的版本号字段

  之后再次更新数据时,会自动调用乐观锁

  实现原理在yiidbBaseActiveRecord::updateInteranl()方法

  

原文地址:https://www.cnblogs.com/baozi-tudou/p/13957793.html