java 多实例 数据同步问题

qq_16598913 2018-11-03 08:32:14
背景:现在有一个javaweb程序,部署在3台服务器上,这3台服务器共用一个数据库,
web程序里面有一项功能,是对每个请求处理后在数据库中 数据项A加1操作

问题:现在有大量请求同时被3台系统处理,怎么保证数据统计正确,
举例:现在有5个请求同时被3台服务处理,操作数据项加1操作,怎么保证最后结果是5,而不是小于5
...全文
263 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
sotondolphin 2018-11-08
  • 打赏
  • 举报
回复
用事务管理做不到吗?!
北飞的企鹅 2018-11-08
  • 打赏
  • 举报
回复
你这种情况 直接悲观锁走起,注意加索引就好了
甲壳虫 2018-11-07
  • 打赏
  • 举报
回复
查询语句使用select....for update,在查询时锁定记录,再update +1,代码中,这2个操作需要在一个事物中,估计就能解决你的问题了,不过for update 的语句是要损耗性能的
kimsung 2018-11-07
  • 打赏
  • 举报
回复
上面说的这几个都ok, 加锁, 或者直接update +=1 还有一种是分散到3的counter数据上。也就是一台机器有自己的一个slot。 最终取得总合的时候sum一下这些slot的值也可以的。 只是太笨了这种方式。
nyq1999 2018-11-07
  • 打赏
  • 举报
回复
直接 update table set count=count+1 where 。。。就可以。这个是原子的。
maradona1984 2018-11-05
  • 打赏
  • 举报
回复
引用 1 楼 qq_16598913 的回复:
如果排除,不用分布式锁的情况,还有其它办法吗!!!!!不用分布式锁,,,不用分布式锁,,,不用分布式锁

不用分布式锁就用乐观锁,要保证成功的话,那就得自旋,也就是更新失败重试
咸哼酒家 2018-11-04
  • 打赏
  • 举报
回复
你这个需求不像统计在线人数还要关心页面关闭和重复登录,
只需要定一个临时内存变量,那个方法请求一次自增长一次即可
qq_16598913 2018-11-03
  • 打赏
  • 举报
回复
如果排除,不用分布式锁的情况,还有其它办法吗!!!!!不用分布式锁,,,不用分布式锁,,,不用分布式锁

81,122

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧