事务中发送消息产生的问题

Posted codespike

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了事务中发送消息产生的问题相关的知识,希望对你有一定的参考价值。

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

@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)睡半秒,问题解决

以上是关于事务中发送消息产生的问题的主要内容,如果未能解决你的问题,请参考以下文章

给予消息队列实现分布式事务

rocketmq源码分析4-事务消息实现原理

分布式事务是如何产生的?TX- LCN实现分布式事务

分布式事务是如何产生的?TX- LCN实现分布式事务

分布式事务是如何产生的?TX- LCN实现分布式事务

分布式事务是如何产生的?TX- LCN实现分布式事务