mysql事物提交以后发送kafka

发现问题

最近开发中遇到一个问题,大致逻辑如下:service中有一个insert方法,在成功插入数据以后要发送kafka,kafak监听到消息后有相关的业务逻辑实现,该逻辑实现需要依赖之前insert插入的数据。
但是这里会存在一个bug:如果insert方法还没有进行事物提交,但是kafka已经监听到消息,此时查询数据库中是没有数据的,那后面的逻辑实现就没有了意义。所以必须保证insert语句成功提交数据以后才能发送kafka。

解决问题

使用TransactionSynchronizationManager.registerSynchronization

示例如下:

	@Override
    @Transactional
    public Integer insert(Entity entity){
    	//示例代码
        Integer result = mapper.insert(entity);
        kafkaMessageSend("topic", entity.getId);
        return result;
    }

	private void kafkaMessageSend(String topic, String message) {
        TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() {
            @Override
            public void afterCommit() {
                kafkaTemplate.send(topic, message);
            }
        });
    }

这是spring事务提供的注册回调接口的方法,通过该方法注册事务回调接口后,spring会在事务提交/回滚前后调用注册回调接口的对应方法。
源码展示

  1. suspend:在spring开启新事务,获取connection之前会调用
  2. resume:开启新事务失败时会调用
  3. flush:没调用
  4. beforeCommit:事务提交前会调用
  5. beforeCompletion:事务提交前会调用,在beforeCommit之后
  6. afterCommit:事务提交后会调用
  7. afterCompletion:事务提交后会调用,在afterCommit之后

除了上述方法,还可以使用 @TransactionalEventListener 监听事务来实现。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
KafkaMySQL是两个不同的技术,它们可以一起使用来实现数据的异步传输和存储。Kafka是一个分布式的消息队列系统,可以用于高吞吐量的数据传输和实时数据流处理。而MySQL是一个关系型数据库管理系统,用于存储和管理结构化数据。 在给定的引用中,引用\[1\]提供了一个使用Flink CDC将MySQL数据通过Kafka消息队列异步传输到MySQL库表的代码实现。引用\[2\]和引用\[3\]分别提供了使用Python编写的Kafka消费者和生产者的代码示例。 引用\[2\]中的代码展示了如何使用Python创建一个Kafka消费者,从Kafka中获取JSON格式的数据,并将其存储到MySQL数据库中。代码中使用了KafkaConsumer模块从Kafka中获取数据,并使用pymysql模块连接到MySQL数据库,将数据插入到数据库表中。 引用\[3\]中的代码展示了如何使用Python创建一个Kafka生产者,从MySQL数据库中查询数据,并将查询结果以JSON格式发送Kafka中。代码中使用了KafkaProducer模块连接到Kafka,并使用pymysql模块连接到MySQL数据库,执行SQL查询并将结果转换为JSON格式后发送Kafka中。 综上所述,通过使用KafkaMySQL的相关模块和API,可以实现将数据从MySQL异步传输到Kafka,或者将数据从Kafka异步传输到MySQL。这样可以实现数据的实时传输和存储,以满足不同的业务需求。 #### 引用[.reference_title] - *1* [4、mysql-->kafka-->mysql](https://blog.csdn.net/vandh/article/details/129015963)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [KafkaMysql的组合使用(Windows中)](https://blog.csdn.net/qq_68383591/article/details/130362461)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [KafkaMySQL的组合使用](https://blog.csdn.net/hhjdshz/article/details/123898035)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值