最近在用Laravel写一个接口,大致逻辑如下:
用户请求接口,校验用户传参,取数据库数据,数据处理,用户请求数据次数+1,用户剩余请求次数数据-1,返回数据。
最近呢,有用户并发比较高,我在校验完数据后拉取数据库用户数据:
$check = User::query()->where('id',$id)->first();
......中间省略数据处理
$remaining_times = $check->remaining_times-1;
$total_times = $check->total_times+1;
$check->update(['remaining_times'=>$remaining_times,'total_times'=>$total_times]);
return response()->json([......]);
根据Log获知,有好几条查询 $remaining_times 和 $total_times 在进行加减以后依然维持原数据。 初步判定为并发导致。当时考虑过用事务处理,悲观锁,乐观锁。
但是出于更方便的处理,最后使用 increment() 和 decrement() 进行处理。
事情暂定为这样再观察。谨以此做记录,如果有更好的方法后续再更新或者欢迎大佬们评论讨论。