防止插入重复,是用数据库的唯一性约束好还是先去数据库查询存不存在好?

2016-09-27 15:34:48 +08:00
 ZiLong
5402 次点击
所在节点    问与答
27 条回复
sherlocktheplant
2016-09-27 23:05:42 +08:00
还有 开发阶段优化性能都是鬼扯 你连实战时候瓶颈在哪都不知道 盲目优化就是过度设计
wsy2220
2016-09-28 01:00:23 +08:00
数据库不就是用来搞这个的么……
lslqtz
2016-09-28 05:56:01 +08:00
前端提醒用查询,伪造用约束。
正常情况下不伪造如果不正确就只会有查询。
ZiLong
2016-09-28 09:41:03 +08:00
@Ouyangan 我觉得你概念搞错了,事务用于保证 ACID,但事务不是互斥的,无法解决并发问题.比如,我查询的时候本来是没有的,然后我查完了,应用程序在做其他事情(比如组装数据),此时其他线程向数据库中插入了一条数据,这条数据与我要插入数据相同,我插入的时候就重复了.这只是一种并发情况,很多种情况都会造成类似这样的并发问题,进而导致数据重复
ZiLong
2016-09-28 09:44:13 +08:00
@vwhenx 框架只是帮你简化工作,但是框架实现细节应该也会遇到类似问题
Nagisa1992
2016-09-28 10:26:07 +08:00
@mingyun 我这边需要获取 insert 和 update 的数量,是不是不能用 ON DUPLICATE KEY ,只能先 select 再 insert 或者 update 然后 count++?
ZiLong
2016-09-28 17:11:50 +08:00
@Nagisa1992 你这个后台不好区分是 update 还是 insert,你如果不加唯一性约束,有可能插入重复的,加了的话,你查询的时候数据库没有,但你插入的时候有可能数据库被其他线程插入了你要插入的数据,你不管直接不加就是了,你要管的话,就要判定抛出的是否是唯一性约束检验失败抛出的异常,进而执行 Update 才++.
另外的方式是,让前端(APP)告诉你是 inset 还是 update,比如,更新和插入走不同接口或者加入一些辅助判断的字段.还有,可以写存储过程或函数,让返回值告诉你.

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

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

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

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

© 2021 V2EX