ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

roketmq 并行发送两条消息,一条消息更新的前半部分,一条消息更新的后半部分,且操作的数据是同一张表时,会导致数据不准确的问题

2020-05-08 10:53:05  阅读:194  来源: 互联网

标签:roketmq 出勤 数据 更新 消息 课次 人数


场景:service层更新了取消考勤的数据,更新以后需要发消息更新课次的实际出勤人数和应出勤人数,

实际出勤人数是一个消息,应出勤人数是一个消息。

问题:在取消考勤以后,数据没有更新正确,然后手动触发更新的接口发现数据更新正确

猜想:猜想是取消考勤操作的数据太多,导致事务还没有真正的提交。消费者消费消息太快,导致在更新课次实际出勤人数的时候,事务还没有提交,导致的数据更新不准确。

验证:

TransactionSynchronizationManager
.registerSynchronization(new TransactionSynchronizationAdapter() {
@Override
public void afterCommit() {
        // 事务提交后,发送更新课次实际出勤mq逻辑
        // 更新班级下的课次应出勤人数
        }
});
然后又使用半消息体系(取消考勤的同时提交一条系统记录插入,待半消息能从系统中查出来时,取消考勤的事务一定是提交了的)
结果,还是数据不准确,感觉是不是代码本身的问题哦。慢慢写日志,记录两条消息更新的数据,猛然发现,
1、更新课次实际出勤人数时,是将课次统计记录先查出来,计算实际出勤人数,在更新实际出勤人数部分。
2、更新课次应出勤人数时,将课次统计记录先查出来,计算应出勤人数,在更新应出勤人数部分。
问题来了,他们两条消息查出来的数据都是任意一条消息更新之前的数据,导致更新只更新了某一条消息更新数据的部分(比如更新了实际出勤部分,或更新了应出勤部分)
故此导致了有时候数据更新准确,数据更新不准确

解决办法,放到同一消息中,先更新实际出勤人数(事务已经提交),在更新应出勤人数(查询的数据是已经更新后的)。问题解决

标签:roketmq,出勤,数据,更新,消息,课次,人数
来源: https://www.cnblogs.com/fancy2041/p/12651529.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有