zoukankan      html  css  js  c++  java
  • 事务中发送消息产生的问题

    这次的场景是,外部模块接受到消息会调用我们的回调接口,更新发送消息前插入的数据,但现在出现了插入的数据找不到的情况,而进入数据库查看插入的数据是存在的

    @Transctional
    public CmsCustomerDetailResult getDetail(){
    //操作数据库,插入数据
    ...
    sendKafkaMessage();
    
    }
    
    
    

    **猜测原因:发kafka消息是瞬发的,而插入数据库的操作被注解式事务锁定,要发送消息后才提交,如果外部系统回调太快就会出现这种情况 **

    修改后:取消注解式事务,使用带返回值的编程式事务缩小事务的粒度,提交后再发消息

     Boolean execute = transactionTemplate.execute(transactionStatus -> {
                dao.insert(customerMergeRecordEntity);
                dao.insertBatch(feedbackRecordEntityList);
                dao.updateFields(customerEntity, true, "isEnable", "customerPhaseType");
                return true;
            });
            if (execute) {
              sendKafkaMessage();
            }
    
    

    修改后问题还存在,发现是某个外部模块消费过快,几乎是马上返回,没办法了,只能在sendKafkaMessage()之前加上sleep(500)睡半秒,问题解决

  • 相关阅读:
    sublime3快捷键汇总
    css3百叶窗轮播图效果
    分页特效
    百度评分标准
    兼容问题汇总
    随机彩票
    js 时间函数 及相关运算大全
    JS贪吃蛇游戏
    《Vim实用技巧》阅读笔记 --- 移动及跳转
    《深入理解Linux网络技术内幕》阅读笔记 --- 路由基本概念
  • 原文地址:https://www.cnblogs.com/CodeSpike/p/13474033.html
Copyright © 2011-2022 走看看