单个用户多次点击事件 会出现并发请求吗
$signRecord = SignRecord::where(['user_id'=>Auth::id(),'date_month'=>now()->format('Y-m')])->first();
if(!$signRecord){
SignRecord::create([
'user_id'=>Auth::id(),
'date_month'=>now()->format('Y-m')
]);
}
前端是vue click 提交签到 然后出现了重复数据 数据库没有设置联合唯一索引
会,如果用户一直点击(前端没加限制 异步)。
在判断是否存在的时候,也会有其他请求进来的。
应该用数据库
unique
(我之前的项目,因为用了
unqiue
,不然就死翘翘
了)前端做限制,后端加把锁,数据库用唯一索引
前端一般是给按钮加个disabled当作loading的
这种东西不要相信前端,最好还是数据库做好
unqiue
不然容易死最好能通过你所做的实际环境进行一下分析,后端进行一下数据筛选。
例如这个环境下,你可以通过队列形式来进行避免,让用户点击的事件推入消费队列中,然后再一个一个拿出来进行处理。如果只通过前端来发起请求的话,建议在前端按钮出加一个loading,或者去抖,这样可以保证当前用户在当前窗口中的短时间内只发起一次。
加唯一索引有局限,除非绝对不可重复的字段。一般用redis锁,key可以组合登陆用户id。
会,懒一点直接让前端做防抖,节流,loading 后端加唯一索引可以,但是只能防止新增 最好是对资源加锁,需要做好超时释放以及复杂业务锁自动续期问题
可以加一个 标识isClick false 是标识不可以提交 true 是标识可提交 当点击提交时 isClick = true 再点击时返回return 就可以实现了 下面是uniapp的示例
第一次点击
再次点击时
这是知识前端例子
后端要判断他是不是已经签到了
没有->签到->返回签到成功
有->返回已签到