大家是如何处理并发场景下的重复插入的?

这里的并发不不一定是经常讨论的那种高并发,可能是某个新建记录的接口被循环curl请求或者前端没有做防抖处理,用户点击太快,导致的数据库里插入了重复数据

数据库记录主键id自增

再额外给一个字段增加唯一索引,这样重复插入数据库会直接异常

有其他常用的方案么?

《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
最佳答案

一般用 Cache 原子锁

$lock = Cache::lock('key', 60);
abort_if(!$lock->get(), 422, '操作过于频繁,请稍后再试!');

...

$lock->release();
4年前 评论
lovecn 4年前
yanthink (作者) 4年前
yzbfeng (楼主) 4年前
fpy5627 4年前
讨论数量: 9

一般用 Cache 原子锁

$lock = Cache::lock('key', 60);
abort_if(!$lock->get(), 422, '操作过于频繁,请稍后再试!');

...

$lock->release();
4年前 评论
lovecn 4年前
yanthink (作者) 4年前
yzbfeng (楼主) 4年前
fpy5627 4年前

一般用 Cache 原子锁

$lock = Cache::lock('key', 60);
abort_if(!$lock->get(), 422, '操作过于频繁,请稍后再试!');

...

$lock->release();
4年前 评论
lovecn 4年前
yanthink (作者) 4年前
yzbfeng (楼主) 4年前
fpy5627 4年前

前端防抖加上呀,这个是主要的。

其他,后端如果有唯一索引问题可以在表单验证环节进行验证,而不是等数据库异常。

频繁请求可以可以进行 ttl 限流(默认频率对于表单提交来说还是不合适的)

4年前 评论
yzbfeng (楼主) 4年前
自由与温暖是遥不可及的梦想

laravel 不是 支持 验证码 唯一验证

4年前 评论
绝缘体菜狗

一个用户只能一条吗?用 redis 集合,集合有唯一性的特点,把用户 id 扔集合里,扔失败,就证明已插过了,扔成功的,就是没插入过的。

4年前 评论
yzbfeng (楼主) 4年前
绝缘体菜狗 (作者) 4年前
yzbfeng (楼主) 4年前

分布式锁,悲观锁

4年前 评论
Sinker 4年前

获取前段提交的一个随机字段存起 如果存在就禁止提交

4年前 评论

这个加表单令牌不就解决了?

4年前 评论
xingchen

高并发高请求的业务来不急查询再添加
如果接口分布在多台机器又不能变量判断
我用的方法是建立一个唯一索引
然后插入用insert ignore

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!