首页 新闻 会员 周边 捐助

异步调用等待期间数据被篡改导致数据不一致问题!

0
悬赏园豆:50 [已解决问题] 解决于 2020-09-10 09:10

本小白在学习关于分布式事务相关内容,关于最终一致性解决方案,有点疑问,由于采用消息队列去处理,所以在消息挤压过多情况下下游可能延时一段时间,假如这一段时间内有同步操作对目标数据进行了操作,就会导致数据紊乱了吧,比如:

  1. 05:10:30秒有一个异步操作 放在了队列里 业务是修改A用户的姓名为'张三',由于队列任务挤压,大约可能的执行时间是05:10:40秒。

  2. 05:10:35秒有个同步的操作修改了A用户姓名为'李四',修改成功,然而05:10:40后由于执行了异步任务,A用户姓名又变为了'张三'。
    这就很迷了。

     想了想这貌似是我分布式事务这里想出的,但是这貌似只是个异步处理的问题,和分布式事务无关,只要异步就会有这个问题,而且我也没找到关于这个问题的一些处理,貌似也没有处理方法,除非同步,小白想问问是酱紫嘛?
静影残月的主页 静影残月 | 初学一级 | 园豆:159
提问于:2020-09-09 17:58
< >
分享
最佳答案
0

很简单实现啊,同步操作换个逻辑把要改的内容放在异步的使用的队列中就好了,如果你异步加锁就毫无意义做异步,干脆同步和异步共用一个队列

收获园豆:50
小小咸鱼YwY | 老鸟四级 |园豆:3312 | 2020-09-09 20:58
其他回答(3)
0

没太看清楚你的逻辑。

消息队列就是 把 任务(或者数据)串行化,既然是串行化,哪里还有所谓并发,就是挨个挨个执行,也就不存在所谓的絮乱。

花飘水流兮 | 园豆:13617 (专家六级) | 2020-09-09 20:17

有道理

支持(0) 反对(0) 楠木大叔 | 园豆:2083 (老鸟四级) | 2020-09-09 22:44
0

所有的操作都做成异步的,不存在同步操作了

yytxdy | 园豆:1680 (小虾三级) | 2020-09-10 01:05
0

long version = getVersion();
long startTime = new Date().getTime();
for( ;; ){
boolean result = updateUser(id, name, version) > 0;
if(result || new Date().getTime() - startTime > 5000){
break;
}
}
update User set name = #{name}, version = #{version} + 1 where id = #{id} and version = #{version}

、大老张 | 园豆:212 (菜鸟二级) | 2021-01-19 16:59
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册