为了账号安全,请及时绑定邮箱和手机立即绑定

java的一个多并发问题

java的一个多并发问题

紫衣仙女 2019-02-22 18:53:20
一个人重复快速多次添加一条数据或者很多人抢某样东西如果仅仅只是插入前先查询的话,那么会出现如下所示的情况: if(用户不存在) { xxxxx 存储用户到数据库 } else { 重复推送,不采取任何措施 } 这个操作还没有执行完毕,第二条拥有相同数据的线程已经进入并通过了if的检验,还是导致数据库存储了两条相同的数据。 synchronized对方法添加同步锁的话也会影响其他的数据啊。而且不想对数据库做唯一索引的操作。 哦对了,我还用到了负载均衡。 请大家给予一个好的思路,谢谢~
查看完整描述

3 回答

?
跃然一笑

TA贡献1826条经验 获得超6个赞

为什么不用唯一索引,就是和自己过不去?

好,就和自己过不去,OK:

最简单的方法,队列

以“很多人抢某样东西”为例,设一个记录“抢”的信息表,不删、不改、只增加、只读

无论多少人多少条请求,都先添加进这个表,不会有什么唯一性问题,也不会冲突

定时任务,读取这个“抢”的信息表,想怎么处理?取第一个?取前100个?

再更新到实际的真实数据库

说到底,就是牺牲时效,保证正确(很多类似这样的设计)

总结:“无延时”、“高性能”、“高可用” 不可兼得,这是常识。。。

查看完整回答
反对 回复 2019-03-01
?
精慕HU

TA贡献1845条经验 获得超8个赞

你先设置好友多少个对象要抢 然后先减1 这个减要是原子的 然后在慢慢的入库 消息队列什么的都可以

查看完整回答
反对 回复 2019-03-01
  • 3 回答
  • 0 关注
  • 492 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信