本小白在学习关于分布式事务相关内容,关于最终一致性解决方案,有点疑问,由于采用消息队列去处理,所以在消息挤压过多情况下下游可能延时一段时间,假如这一段时间内有同步操作对目标数据进行了操作,就会导致数据紊乱了吧,比如:
05:10:30秒有一个异步操作 放在了队列里 业务是修改A用户的姓名为'张三',由于队列任务挤压,大约可能的执行时间是05:10:40秒。
05:10:35秒有个同步的操作修改了A用户姓名为'李四',修改成功,然而05:10:40后由于执行了异步任务,A用户姓名又变为了'张三'。
这就很迷了。
想了想这貌似是我分布式事务这里想出的,但是这貌似只是个异步处理的问题,和分布式事务无关,只要异步就会有这个问题,而且我也没找到关于这个问题的一些处理,貌似也没有处理方法,除非同步,小白想问问是酱紫嘛?
很简单实现啊,同步操作换个逻辑把要改的内容放在异步的使用的队列中就好了,如果你异步加锁就毫无意义做异步,干脆同步和异步共用一个队列
没太看清楚你的逻辑。
消息队列就是 把 任务(或者数据)串行化,既然是串行化,哪里还有所谓并发,就是挨个挨个执行,也就不存在所谓的絮乱。
有道理
所有的操作都做成异步的,不存在同步操作了
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}