广东网站建设公司排名/镇江seo公司
说明下这个问题出现背景。最近新开发一个类似于电商的系统,里面会涉及到很多更新操作,入商品的库存更新。之前以为没有注意到并发操作的问题,导致代码存在问题。记录下来,加深印象避免后续再有这样的问题。
这里还是使用的yii1框架,大家知道一般yii1中更新数据,一个有两种操作方式。代码如下:
- 使用update方法,还有update,updateAll具体方法这里不具体讨论
(new model)->updateAll(['count' => new \CDbExpression('`count`-' . $changeCount),
],'限制条件');
- 使用save()
$model = (new Model())->findByAttribute();
//.....经过一系列计算,根据原来的count获取到count
$model->count = $new_count
//....可能其他值更新
$model->save();
之前一般操作更新,比较喜欢用save()。尤其是之前代码中已经获取到$model,但是这种处理方式会存在问题,因为是处理的count,是获取的之前一个时间点的数据,假如在获取count到处理更新的count这个时间段中,其他操作已经更新了这条记录,就存在数据不一致的问题。
针对这个问题是采用update会比save合理,update更新时是会实时获取给更新的记录加锁。
这里要是只更新数量,可以使用updateCount,可以直接操作数量增减,这里使用update主要是不仅更新count,还会涉及到其他字符串字段更新。
但是使用update也会存在一个其他问题,在这一系列计算中,不容易用new \CDbExpression(’count
-’ . $changeCount)这种方式实现。这样只能增减固定计算,涉及到在复杂的计算就不好操作了,只能写原生sql。
相比较使用update更新会比较合理。
如果你也喜欢旅行可以看下这里,自己的旅行网站,记录我们的一些旅行经历和大家分享,希望你可以喜欢:https://www.lanlianhua.org/