事务不当使用导致脏数据

本文探讨了一个后台系统在更新试题信息时遇到的问题,由于在updateQuestion方法上错误地添加了@Transactional注解,导致整个方法在一个事务中执行。当MQ消息消费速度超过MySQL更新速度时,MongoDB接收到的试题信息是旧的,从而产生脏数据。解决方案是仅在涉及更新的updateQuestionInfo方法上使用@Transactional,确保事务隔离。
摘要由CSDN通过智能技术生成

 一.问题背景

 1.遇到的问题

     后台系统存储试题信息,同时使用了mysql和mongo,后台试题做了更改,会先写入到mysql,
同时mysql查询更新的试题信息,发送mq消息,更新mongo的信息。
出现的问题:
    后台更改了试题信息,mysql库中存储的是更新后的信息;mongo中也确实走了mq消息,
但是从mysql中查询出来的信息,一直是未更改之前的,所以mongo中更新过去,一直是更新前
的消息,有点纳闷。

2.代码片段


   // 更新试题信息方法
    @Transactional
    public void updateQuestion() {
        //1.更新mysql
        updateQuestionInfo();
        //2.通过mq,查询mysql库中的试题信息,组装成mongo 结构,写入到mongo。
        //2.1 写入mongo的过程中,会从mysql中查询一下现在的数据信息。
        //3.通过mq,发送试题ID到ES查重复
        //4.添加操作记录
    }

    @Transactional
    public void updateQuestionInfo() {
        //1.更新试题基础内容
        //2.更新 试题对应的地区
        //3.更新 试题对应的知识点
    }

 3.复现方法

         执行完方法一,将断点打到 2.1处,然后未开始执行方法二,此时查询mysql 和 mongo中的数据,
发现 此时mysql中的数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值