java的一个多并发问题

发布于 2022-09-06 08:07:51 字数 338 浏览 14 评论 0

一个人重复快速多次添加一条数据或者很多人抢某样东西
如果仅仅只是插入前先查询的话,那么会出现如下所示的情况:

if(用户不存在)
{
    xxxxx
    存储用户到数据库
}
else
{
    重复推送,不采取任何措施
}

这个操作还没有执行完毕,第二条拥有相同数据的线程已经进入并通过了if的检验,还是导致数据库存储了两条相同的数据。

synchronized对方法添加同步锁的话也会影响其他的数据啊。而且不想对数据库做唯一索引的操作。

哦对了,我还用到了负载均衡

请大家给予一个好的思路,谢谢~

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

情绪操控生活 2022-09-13 08:07:51

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

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

最简单的方法,队列

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

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

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

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

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

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

公布 2022-09-13 08:07:51

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

苯莒 2022-09-13 08:07:51

几种解决方式。

高并发下。

  1. 引用mq,使其顺序执行。但是无法全局顺序;
  2. 把Java的if写到存储过程中。这样,java与DB的交互就是一次。java调用存储过程,只需要得到执行行数即可。

非高并发下。

  1. 针对“一个人快速点击”,请求完,使按钮置灰色;
  2. 针对“多个人抢购”,增加队列(要么mq,要么维护java内存队列)顺序处理。有单点风险(可做客户端路由,但是需要增加zk监听,自动发现机制。略复杂)。
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文