YII中的updateByPk中的参数是不是有点鸡肋?
程序员文章站
2022-05-25 13:58:21
...
这updateByPk有四个参数,其中第三个参数我感觉有点鸡肋。因为第三个参数是条件。那我主键只有一个,我干嘛还要整一个条件呢?也就是通过主键就能找到唯一的列,我还要条件干啥啊!
回复内容:
这updateByPk有四个参数,其中第三个参数我感觉有点鸡肋。因为第三个参数是条件。那我主键只有一个,我干嘛还要整一个条件呢?也就是通过主键就能找到唯一的列,我还要条件干啥啊!
不是。
首先,最后两个参数是可以省略的,对于简单的更新,这个方法调用很方便。
其次,如果更新还包含其它限制,那么后面的两个参数就派上用场了。一般情况下,用主键来唯一确定一条记录,这里把主键写在第一参数位置,可以突出主键,出错的概率更小。
比如用户要更新自己写的文章,那一般都是先靠主键定位到文章ID,再通过附加条件“uid=:uid”来确定是当前用户来防止其他用户提交恶意ID来做修改。(目前我只有这种应用场景用到第三个参数)
比如你要更新ID为3的帐号给他扣除10块钱
读余额,然后直接updateByPk
然后你就完蛋了,因为交易频率高的时候,不能保证你读到余额以后,没有别的进程写了另一个新的余额进去,连买2个却只扣了一次钱之类的问题就来了
这时候就需要加条件了,具体来说
balance, version = readByPk pk
balance -= 10
updateBypk pk, {balance:balance, version:version+1}, version=version
通过“版本号”防止并发场景下数据错乱。好像行话叫乐观锁,可以去了解一下
上一篇: 在SQL2k降序索引上使用中bug