在spring boot的声明式事务中,一次只能指定一个TransactionManager,所以在默认情况下一个方法中,只能支持mysql或mongo其中一个的事务。但是在日常业务中,很多时候一段业务内既有mongo也有mysql,这时就需要mysql和mongo的事务同时支持,不然可能就会出现mysql和mongo数据不一致的情况。
ChainedTransactionManager
ChainedTransactionManager是Spring框架中的一个事务管理器实现,它可以将多个事务管理器组合在一起形成一个链式的事务管理器。但是值得注意的是,只是链式反应事务管理器,而不是分布式事务(XA 之类的)。所以在某些复杂的情况下依旧不能做到事务的一致性。所以ChainedTransactionManager仅支持简单的事务场景。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| @Configuration @Slf4j
public class TransactionConfig { @Bean @Primary 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
1 2 3 4 5 6
| @Transactional() 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
虽然已经废弃,但是能支持简单情况事务处理。