yii使用中的需要注意的并发更新问题

本文探讨了在高并发场景下,电商系统商品库存更新时遇到的数据一致性问题。通过对比使用save()和update()方法,阐述了update()在处理并发更新时的优势,尤其是在实时锁定目标记录方面。同时,指出了使用update()在复杂计算场景下的局限性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

说明下这个问题出现背景。最近新开发一个类似于电商的系统,里面会涉及到很多更新操作,入商品的库存更新。之前以为没有注意到并发操作的问题,导致代码存在问题。记录下来,加深印象避免后续再有这样的问题。

这里还是使用的yii1框架,大家知道一般yii1中更新数据,一个有两种操作方式。代码如下:

  1. 使用update方法,还有update,updateAll具体方法这里不具体讨论
(new model)->updateAll([
    'count' => new \CDbExpression('`count`-' . $changeCount),
],'限制条件');
  1. 使用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/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值