让SpringBoot同时支持数据库事务和kafka事务
@Configuration
public class TransactionConfig {
/**
* 1.解决DataSourceTransactionManagerAutoConfiguration
* ConditionalOnMissingBean(TransactionManager.class)
* 导致spring-kafka开启事务后创建了kafkaTransactionManager而不再注册DataSourceTransactionManager
* 2.自定义创建DataSourceTransactionManager
* 并将DataSourceTransactionManager设为默认事务管理器
*/
@Bean
@Primary
DataSourceTransactionManager transactionManager(Environment environment, DataSource dataSource,
ObjectProvider<TransactionManagerCustomizers> transactionManagerCustomizers) {
DataSourceTransactionManager transactionManager = createTransactionManager(environment, dataSource);
transactionManagerCustomizers.ifAvailable((customizers) -> customizers.customize(transactionManager));
return transactionManager;
}
private DataSourceTransactionManager createTransactionManager(Environment environment, DataSource dataSource) {
return environment.getProperty("spring.dao.exceptiontranslation.enabled", Boolean.class, Boolean.TRUE)
? new JdbcTransactionManager(dataSource) : new DataSourceTransactionManager(dataSource);
}
}
原因分析:因为ConditionalOnMissingBean(TransactionManager.class)的作用是如果容器中已经有TransactionManager类型的bean的话则不创建DataSourceTransactionManager,所以kafka开启事务后创建了kafkaTransactionManager故不再创建DataSourceTransactionManager,所以数据库事务失效了