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

雖然已經廢棄,但是能支持簡單情況事務處理。

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。