首页 新闻 会员 周边 捐助

mysql 大并发情况下,先查询,存在则更新,不存在则插入,求解

0
悬赏园豆:30 [已解决问题] 解决于 2017-12-18 11:16
long count = select count(0) from table_a where name = "jack";
if (count > 0) {
  update
} else {
  insert  
}

并发情况下:

问题1:

是不是只有当name为jack这条记录不存在的时候,才会产生并发问题

问题二:

是不是当name为jack这条记录存在时,就不会产生并发问题

 

个人观点:

当name为jack这条记录不存在时,mysql行锁没有起到作用,导致最终还是有可能插入多条

当name为jack这条记录存在时,该记录被锁住,所以不会产生并发问题。

请各位大神赐教,确实比较不太懂。望能详细讲解一下。感谢!!!

问题补充:

并且能否提供一下解决方案。

个人想到的一个解决方案是在表中加上唯一索引, 用mysql的扩展语法,

ON DUPLICATE KEY UPDATE  解决, 但是感觉好多sql都要加比较麻烦。

皇上吉祥的主页 皇上吉祥 | 初学一级 | 园豆:93
提问于:2017-10-16 17:39
< >
分享
最佳答案
0

1.查询

2.存在时插入

3.删除符合条件的除了最后一条的其他数据

收获园豆:30
吴瑞祥 | 高人七级 |园豆:29449 | 2017-10-16 17:43

我这边的并发量有点大,这样频繁的删除数据,不太好吧

皇上吉祥 | 园豆:93 (初学一级) | 2017-10-16 17:50

@皇上吉祥: 那就搞个分布式锁.而且删除的问题也不是很大.只要没太多索引.

吴瑞祥 | 园豆:29449 (高人七级) | 2017-10-16 18:02

@吴瑞祥: 索引还是有的,2,3个。分布式锁没什么研究。

皇上吉祥 | 园豆:93 (初学一级) | 2017-10-16 18:03

@皇上吉祥: 唯一索引会有业务问题的.

如果你的业务是唯一索引能满足的可以用.

不能满足的情况是:name为jack并且status为1的数据只能有1条.status为0的数据可以有多条.

这种情况唯一索引是做不了的.

吴瑞祥 | 园豆:29449 (高人七级) | 2017-10-16 18:05

@吴瑞祥: 唯一索引,感觉比较麻烦,因为我有好多sql要加,并且条件较多,大概4-6个,做联合索引的话,会不会影响插入?

不满足的情况没看懂。。。

皇上吉祥 | 园豆:93 (初学一级) | 2017-10-16 18:10
其他回答(4)
0

mysql on duplicate key

[3] | 园豆:1174 (小虾三级) | 2017-10-16 18:07

唯一索引,感觉比较麻烦,因为我有好多sql要加,并且条件较多,大概4-6个,做联合索引的话,会不会影响插入?

是否有别的解决方案?

支持(0) 反对(0) 皇上吉祥 | 园豆:93 (初学一级) | 2017-10-16 18:11

@皇上吉祥: 把这些条件拼接成一个冗余字段,匹配更新,比如A#B#C#D;四个字段确定唯一性,不唯一就更新

支持(0) 反对(0) [3] | 园豆:1174 (小虾三级) | 2017-10-16 18:13

@[3]: 这个我也有考虑,但是改动较大。还有没别的方案

支持(0) 反对(0) 皇上吉祥 | 园豆:93 (初学一级) | 2017-10-16 18:15
0

on duplicate这个是最省的了,换其他的代码改动还要大(确保原子性的情况下)

Daniel Cai | 园豆:10424 (专家六级) | 2017-10-16 18:34
0

采用redis setnx 方式 解决

皇上吉祥 | 园豆:93 (初学一级) | 2017-10-26 18:28
0

第一种方案就是加唯一索引,使用mysql on duplicate key

第二种就是使用 insert  into table_a() select  v1, v2 from DUAL where not exists( 条件 )

陈其苗 | 园豆:216 (菜鸟二级) | 2017-11-15 15:22
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册