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都要加比较麻烦。
1.查询
2.存在时插入
3.删除符合条件的除了最后一条的其他数据
我这边的并发量有点大,这样频繁的删除数据,不太好吧
@皇上吉祥: 那就搞个分布式锁.而且删除的问题也不是很大.只要没太多索引.
@吴瑞祥: 索引还是有的,2,3个。分布式锁没什么研究。
@皇上吉祥: 唯一索引会有业务问题的.
如果你的业务是唯一索引能满足的可以用.
不能满足的情况是:name为jack并且status为1的数据只能有1条.status为0的数据可以有多条.
这种情况唯一索引是做不了的.
@吴瑞祥: 唯一索引,感觉比较麻烦,因为我有好多sql要加,并且条件较多,大概4-6个,做联合索引的话,会不会影响插入?
不满足的情况没看懂。。。
mysql on duplicate key
唯一索引,感觉比较麻烦,因为我有好多sql要加,并且条件较多,大概4-6个,做联合索引的话,会不会影响插入?
是否有别的解决方案?
@皇上吉祥: 把这些条件拼接成一个冗余字段,匹配更新,比如A#B#C#D;四个字段确定唯一性,不唯一就更新
@[3]: 这个我也有考虑,但是改动较大。还有没别的方案
on duplicate这个是最省的了,换其他的代码改动还要大(确保原子性的情况下)
采用redis setnx 方式 解决
第一种方案就是加唯一索引,使用mysql on duplicate key
第二种就是使用 insert into table_a() select v1, v2 from DUAL where not exists( 条件 )