你们怎么判断Laravel的Update是否成功
$amount = $user->amount + $cash;
$result = User::where('id', $user->id)->where('amount', $user->amount)->update(['amount' => $amount]);
if(!$result) {
throw new InvalidRequestException('修改真实金额失败,请刷新重试');
}
这个代码有一个坑,就是我是通过判断$result来决定更新是否成功的,但是这样有一个问题,一旦更新的数据和原本是一样的,返回也是0,这样就起不到我想通过加where条件来起到乐观锁的目的了,你们有啥好的办法没
没有维护updated_at字段?
很少判断更新或者插入是否成功,真的,大多数laravel开发者都是这样。
根据你的业务逻辑来说,流程应该是这样
因为在累加的情况下,我实在是想不到除了 cash 是0以外,为什么会有一旦更新的数据和原本是一样的的情况
数据如果是一样的,那么前端就应该做拦截处理,而不是请求接口。
面向对象编程
,User::where()->update()
返回的是影响行数,$user->save()
返回的是是否执行成功!可以加个事务 :joy:
你这个代码写的没毛病, 你再加一个 当前要更新去的金额和数据库里的金额是否一直的判断就可以了啊, 其实就是判断 $cash 是否为 0, 为 0 的话根本都不用走更新数据库的逻辑
你这并不是单纯+0 的问题,并发情况下加事物
一般加事务
和事务没关系,就是+0的问题导致update返回为0 我这个是实现乐观锁,更新之前判断$cash是否为0目前是比较中意的方案
简单说就是先拦截
为啥要判断?更新了肯定会成功,不成功框架自然会抛出异常。你要做的是处理那部分异常怎么显示更友好而已。
@jhazusj 需要回滚其它SQL执行,比如说添加财务日志这样的