由@Transactional引发的异步消息数据不同步问题
事件背景:由于项目使用的是spring cloud 架构,各个服务通过eureka注册,通过feign相互调用,对外暴露了一个服务给第三方公司调用,同时最终还要同步数据到另一家公司,结构如下图
现在遇到一个问题,第三方业务回调的最新状态,我们自己修改了,到另外一家的时候状态还是之前的,由于中间穿插了4~6个服务,排查日志比较困难。
发现问题:
经过排查各个服务大量日志文件,发现各个关键的业务日志也正常打印了,但是到最后一步查询表1的数据有些是不正确的,经过层层排查,最终判断可能是下面这段代码导致的。这个方法是这么写的
服务一代码:
@Transactional
public xx 方法名(参数){
//1.更新数据表1
//2.更新数据表2
//3.发送延时消息mq
}
服务二代码:
消费延时mq消息,然后查询数据库获取数据后同步到第三方服务,查询的数据包括数据表1、数据表2等数据
原因猜想(由于时间问题,没来得及测试)
@Transactional 能保保持数据回滚的一致性,应该是做了缓存的,修改完表1,再修改表2,然后发送mq,最后方法结束后才会提交修改到数据库进行修改,而mq消费时间设置过短,导致发送mq后,另一个服务很快就消费掉了,查询的数据是未更新前的,所以导致数据未更新,数据未更新就发送到数据接收方了,所以导致数据不同步。
最终修改完延时消息的时间后问题得到解决。
由于没有深入研究过@Transactional保持回滚的机制,可能有些想的不对,望见谅!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律