banner
WilsonJ

WilsonJ

github
follow

【mongo事务】在spring boot 中,整合mongo和mysql的事务。

在 spring boot 的声明式事务中,一次只能指定一个 TransactionManager,所以在默认情况下一个方法中,只能支持 mysql 或 mongo 其中一个的事务。但是在日常业务中,很多时候一段业务内既有 mongo 也有 mysql,这时就需要 mysql 和 mongo 的事务同时支持,不然可能就会出现 mysql 和 mongo 数据不一致的情况。

ChainedTransactionManager#

ChainedTransactionManager 是 Spring 框架中的一个事务管理器实现,它可以将多个事务管理器组合在一起形成一个链式的事务管理器。但是值得注意的是,只是链式反应事务管理器,而不是分布式事务 (XA 之类的)。所以在某些复杂的情况下依旧不能做到事务的一致性。所以 ChainedTransactionManager 仅支持简单的事务场景。

@Configuration
@Slf4j
/**
 * 事务管理
 * 整合mongo  mysql 事务
 */
public class TransactionConfig {
    @Bean
    @Primary //mysql事务管理器  默认事务管理器
    public JdbcTransactionManager mysqlTransactionManager(DataSource dataSource) {
        return new JdbcTransactionManager(dataSource);
    }

    @Bean(name = "mongoTransactionManager")
    public MongoTransactionManager mongoTransactionManager(MongoDatabaseFactory factory) {
        return new MongoTransactionManager(factory);
    }

    @Bean(name = "chainedTransactionManager")
    public ChainedTransactionManager chainedTransactionManager(JdbcTransactionManager jdbcTransactionManager, @Qualifier("mongoTransactionManager") MongoTransactionManager mongoTransactionManager) {
        return new ChainedTransactionManager(jdbcTransactionManager,mongoTransactionManager);
    }
}

在这里配置 3 个 TransactionManager,后续可以根据具体业务在 @Transactional 指定使用的 TransactionManager

@Transactional() //这里默认的是mysql的TransactionManager
public void methodA() {}
@Transactional(value = "mongoTransactionManager")
public void methodA() {}
@Transactional(value = "chainedTransactionManager")
public void methodA() {}

但是 spring 官方在 2020 年 11 月已经开始将 ChainedTransactionManager 标记为 @Deprecated,具体原因可看https://github.com/spring-projects/spring-data-commons/issues/2232

虽然已经废弃,但是能支持简单情况事务处理。

加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。