java的一个多并发问题
一个人重复快速多次添加一条数据或者很多人抢某样东西
如果仅仅只是插入前先查询的话,那么会出现如下所示的情况:
if(用户不存在)
{
xxxxx
存储用户到数据库
}
else
{
重复推送,不采取任何措施
}
这个操作还没有执行完毕,第二条拥有相同数据的线程已经进入并通过了if的检验,还是导致数据库存储了两条相同的数据。
synchronized对方法添加同步锁的话也会影响其他的数据啊。而且不想对数据库做唯一索引的操作。
哦对了,我还用到了负载均衡。
请大家给予一个好的思路,谢谢~
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
为什么不用
唯一索引
,就是和自己过不去?好,就和自己过不去,OK:
最简单的方法,
队列
以“很多人抢某样东西”为例,设一个记录“抢”的信息表,不删、不改、只增加、只读
无论多少人多少条请求,都先添加进这个表,不会有什么唯一性问题,也不会冲突
定时任务,读取这个“抢”的信息表,想怎么处理?取第一个?取前100个?
再更新到实际的真实数据库
说到底,就是牺牲时效,保证正确(很多类似这样的设计)
总结:
“无延时”、“高性能”、“高可用” 不可兼得
,这是常识。。。你先设置好友多少个对象要抢 然后先减1 这个减要是原子的 然后在慢慢的入库 消息队列什么的都可以
几种解决方式。
高并发下。
非高并发下。