mysql 怎么防止重复插入呢

2019-05-17 10:42:44 +08:00
 noble4cc

使用 unique key 可以保证

但是不使用唯一 key 的情况并且在并发提交的情况下怎么防止重复插入呢?

比如浏览器卡了一下,导致用户重复点击提交了

9617 次点击
所在节点    MySQL
47 条回复
eziooooo
2019-05-17 11:34:55 +08:00
1. 请求锁(这个请求这个人 N 秒内只能请求一次)
2. 事务
xuanbg
2019-05-17 11:40:07 +08:00
先查后写是需要加锁作为前提的,没有锁,就有幻读的可能。如果是分布式系统,那这个锁就必须是分布式锁才行。
前端防重发是标准配置,不做的都不是合格的前端。
dilu
2019-05-17 11:56:55 +08:00
前端防连点,后端做个锁,记得开事务,表上加个唯一索引
est
2019-05-17 12:00:12 +08:00
1. 楼主问的是表单提交如何防止重复,这个其实很简单。用 E-tag 这个 http 头控制即可。根本 不用太涉及 db 层面的东西。在 session 就处理了。
2. 如果是 db 层面需要防止重复,我个人遇到更麻烦的问题是批量插入的时候。没有主键和 uniq key 可以用来鉴别。很麻烦。
jowan
2019-05-17 12:00:31 +08:00
CSRF_TOKEN 可以解决这个问题,顺便还能解决跨站的表单提交
Weixiao0725
2019-05-17 12:17:52 +08:00
只有 uniq key 一条路子要想真正有效。
sun1991
2019-05-17 12:28:53 +08:00
从数据库层面上, 用 unique key 解决此类问题是最合适的, 为什么要给自己找不痛快呢?
glfpes
2019-05-17 12:40:33 +08:00
为何不能设置 unique ?
AngryPanda
2019-05-17 12:40:37 +08:00
@jowan CSRF Token 并不是(也不能)用来解决这个问题的;

最大的问题是,CSRF Token 并不会一直变化。
fmumu
2019-05-17 12:41:34 +08:00
先查重再插入,并发时候有重复插入的可能
应该先插入再查重(使用隔离级别 read commit)吧
Comdex
2019-05-17 12:44:40 +08:00
使用队列使并发请求串行
jason19659
2019-05-17 12:45:23 +08:00
前端是用户表单的重复提交还是什么?无意的还是故意的?
浏览器卡一下。。每次刷新生成一个 id 就完了,提交了这个 id 就不再处理
R18
2019-05-17 12:47:47 +08:00
悲观锁
pudgedoor
2019-05-17 12:50:59 +08:00
数据库锁怎么样,乐观锁
opengps
2019-05-17 12:55:38 +08:00
如果是浏览器卡了一下多点击了提交,那么先查询在写入可以应对
BestSera
2019-05-17 14:06:24 +08:00
for update
悲观锁 乐观锁都行
799635347
2019-05-17 14:06:35 +08:00
分布式锁,或者丢消息队列串行消费,或者数据库级别加 unique 约束,token 这种应该不能解决
mikicomo
2019-05-17 14:13:05 +08:00
@eluotao #10 这也是要唯一键的,他 ignore 是一直监听着唯一键,如果抛出重复键错误直接忽略
luwies
2019-05-17 14:15:10 +08:00
貌似有一种办法是刷出这个提交信息的页面的时候给前端一个唯一值,提交信息的时候把找个值带上,如果是重复的就忽略了。
kiddult
2019-05-17 14:20:38 +08:00
@AngryPanda 他想的是在每次提交前的页面访问都重新生成 CSRF Token,解除和 session 的绑定

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/564960

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX