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

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

数据库记录主键id自增

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

有其他常用的方案么?

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 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年前
绝缘体菜狗

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

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

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

4年前 评论
自由与温暖是遥不可及的梦想

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

4年前 评论

分布式锁,悲观锁

4年前 评论
Sinker 4年前

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

4年前 评论

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

4年前 评论

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