mysql 怎么防止重复插入呢

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

使用 unique key 可以保证

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

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

9860 次点击
所在节点    MySQL
47 条回复
JacFrak
2019-05-17 10:46:10 +08:00
如果是 ajax 提交,点击提交按钮事件里面将按钮设置为不可操作
noble4cc
2019-05-17 11:01:51 +08:00
@JacFrak 嗯嗯如果是单纯的 form 呢
DovaKeen
2019-05-17 11:02:24 +08:00
引入事务,在插入前先搜索一下有没有重复,如果有的话就取消插入,没有再插入?但是这样的话似乎要把隔离级别设置的很高…
DovaKeen
2019-05-17 11:03:27 +08:00
@noble4cc
@JacFrak 我觉得虽然是 web 工程,但是浏览器并不一定是唯一的客户端,不能排除有潜在的攻击者自己构建 http 请求往服务器发的可能啊
zhuzhiqiang
2019-05-17 11:03:46 +08:00
form 埋个 token form 提交后就把这个 token 删了 token 不存在即是重复提交
peyppicp
2019-05-17 11:04:06 +08:00
分布式锁
hlwjia
2019-05-17 11:04:42 +08:00
没有 unique 的情况下只能先查重再插了
Immortal
2019-05-17 11:05:50 +08:00
服务端搞个 token 存到 session 或者什么地方 然后发给前端
前端提交表单的时候一起提交着个 token
如果一致就处理
不一致当成重复提交 不处理
以上是一个成熟且常规的做法
noble4cc
2019-05-17 11:07:57 +08:00
@DovaKeen 好像是可以解决并发问题,查的时候加锁能解决
eluotao
2019-05-17 11:08:06 +08:00
插入或忽略
如果我们希望插入一条新记录( INSERT ),但如果记录已经存在,就啥事也不干直接忽略,此时,
可以使用 INSERT IGNORE INTO ...语句:

INSERT IGNORE INTO students (id, class_id, name, gender, score) VALUES (1, 1, '小明', 'F', 99);
jorneyr
2019-05-17 11:10:00 +08:00
根据业务数据特点建立唯一索引
aitaii
2019-05-17 11:12:22 +08:00
幂等
fl0w
2019-05-17 11:13:42 +08:00
insert into table(field1,field2)
select value1,value2 from dual where not exists( select 1 from table where field1 = value1 and field2 = value2)
JacFrak
2019-05-17 11:25:24 +08:00
@Immortal 这个不错,受教
vance
2019-05-17 11:26:18 +08:00
分布式锁,单个数据库个可以 insert into XX ... select x from dual where not exists( select from xx )
noble4cc
2019-05-17 11:26:20 +08:00
@fl0w 不加锁查恐怕不行吧,会有幻读问题
noble4cc
2019-05-17 11:26:54 +08:00
@eluotao ignore 必须唯一 key
noble4cc
2019-05-17 11:28:00 +08:00
@Immortal 相当于这个 form 是一次性的也可以的
tabris17
2019-05-17 11:28:06 +08:00
一次性 token
Hellert
2019-05-17 11:30:41 +08:00
难道不应该是在每次提交前手动检查业务键是否重复吗?比如一些 编号 字段。

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

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

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

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

© 2021 V2EX