@Transactional 注解与事务同步器:确保 MQ 消息在事务提交后发送

在使用 Spring 进行数据库操作时,我们经常使用 @Transactional 注解来标识需要在事务中执行的方法。为了确保某些操作(例如发送 MQ 消息)在事务提交完成后才执行,我们可以使用 Spring 的 TransactionSynchronizationManager 来注册一个事务同步器。

示例代码:

@Transactional(rollbackFor = Exception.class)
TackAnOrderVo tackAnOrder(@RequestBody @Validated PlaceOrderVo vo) {

    // 提交订单

    // 提交库存

    // 提交其他

    // 发送消息到 MQ
    TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() {
        @Override
        public void afterCommit() {
            // 发送mq更新es库存标志
            for (Long drugId : drugIdList) {
                DrugChangeMessage drugChangeMessage = new DrugChangeMessage();
                drugChangeMessage.setDrugId(drugId);
                drugChangeMessage.setStoreId(order.getStoreId());
                drugChangeMessage.setChangeType(5);
                drugChangeMessage.setMerchantId(Long.parseLong(merchantId));
                drugChangeMessage.setEnterpriseId(Long.parseLong(enterpriseId));
                drugChangeMessage.setPlatformId(Long.parseLong(platformId));
                drugProducer.sendDrugChangeMsg(drugChangeMessage);
            }
        }
    });

}

解释:

  1. 使用 @Transactional(rollbackFor = Exception.class) 注解标识方法需要在事务中执行,并且在发生异常时进行回滚。

  2. 使用 TransactionSynchronizationManager.registerSynchronization() 方法注册一个事务同步器。

  3. 在 afterCommit() 方法中,发送 MQ 消息。

通过这种方式,我们可以在事务提交完成后再发送 MQ 消息,避免在发生异常时发送错误的消息。

注意:

  • TransactionSynchronizationManager 是一个线程绑定的类,它可以保证在同一个线程中注册的事务同步器会按顺序执行。
  • 在 afterCommit() 方法中,可以使用 TransactionSynchronizationManager 的 getResource() 方法获取事务相关的信息,例如当前的事务状态。

总结:

@Transactional 注解和 TransactionSynchronizationManager 提供了一种有效的方式来确保 MQ 消息在事务提交完成后再发送,提高了系统的可靠性和安全性。

@Transactional 注解与事务同步器:确保 MQ 消息在事务提交后发送

原文地址: https://www.cveoy.top/t/topic/pgKc 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录