tyhqiushen
tyhqiushen
采纳率0%
2016-08-27 09:08 阅读 5.4k

Java并发添加数据,如何保证不会添入相同的数据?

我有这样的业务场景:

一个接口往mysql的user表中insert数据,一个realname字段和一个groupid字段。

我现在想保证realname添入的时候同一group下不能有重复的,但是我现在不能给这两个字段加联合唯一索引。

因为库里realname有很多是空的情况。

问题:

现在我在用大量线程访问这个接口,添加user。这些线程realname如果有相同的,就可能会添入realname一样的数据。

我如何处理才能保证一定不会添入重复数据?不能用synchronized关键字,因为是多机集群部署。

一个服务器保证同步,其他的依然肯定会出现这个问题。

小弟请教各位大神,这种情况如何处理,小弟技术小白一个,请详细一点说明,先谢谢各位了。

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

4条回答 默认 最新

  • liuxian13183 刘兆贤 2016-08-27 09:25

    每次插入,写个额外线程去查重,如果有重复则删除只剩一个

    点赞 评论 复制链接分享
  • yunyunxiongsd yunyunxiongsd 2016-08-27 09:56

    如果不可以重复的是一个字段的话 可以设为主键 如果不是一个的话只能在insert前检测

    点赞 评论 复制链接分享
  • wgslucky wgslucky 2016-08-27 14:52

    这种情况的话,你可以借助于消息队列,比如rabbitmq,或redis的list,即你把你的所有线程的操作不要直接插入数据库,而是先放到消息队列中,再另起一个服务,从消息队列中接收数据并存储。在这个服务上再加一层缓存,把插入过的数据都缓存起来,插入的时候从缓存中查看是否已经存在了。
    这样你的业务也不用再等数据库返回了。可以增加处理效率。

    点赞 评论 复制链接分享
  • wgslucky wgslucky 2016-08-28 13:19

    在服务启动的时候,要把数据库中已存在的数据加载到缓存中,如果数据量大,可以使用带持久化的缓存,比如redis。

    点赞 评论 复制链接分享

相关推荐