标签:sendKafkaMessage 事务 数据库 dao execute 发送 插入 消息
这次的场景是,外部模块接受到消息会调用我们的回调接口,更新发送消息前插入的数据,但现在出现了插入的数据找不到的情况,而进入数据库查看插入的数据是存在的
@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)睡半秒,问题解决
标签:sendKafkaMessage,事务,数据库,dao,execute,发送,插入,消息 来源: https://www.cnblogs.com/CodeSpike/p/13474033.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。