问题描述
说来奇怪,这个问题的发现是一个非常偶然的情况
因为鼠标问题,点击一次,触发了两次,导致了并发,比如只有三件库存,快速点击两次生成了两条记录,但是库存缺只减少了一个,
为了复现这个问题,使用我单身20年的手速,尝试了很多次才会有一次并发问题出现
起初遇到这个问题时,想的是为什么库存只减少了一个,应该是减少两个才对,难道是数据表只更新了一次,后来才明白,商品表更新了两次,只是因为两次的操作都是将3更新为2
问题解决
首先前端更新版本做了限制,重复点击只会调用一次接口
后端使用乐观锁
因为PHP框架使用的是yii2,所以乐观锁加起来也比较方便,首先在对应的商品表中增加版本号字段 如 version 类型为整型
然后重写
public function optimisticLock() { return 'version'; }
返回值为自己定义的版本号字段
之后再次更新数据时,会自动调用乐观锁
实现原理在yiidbBaseActiveRecord::updateInteranl()方法