spring-kafka开启事务导致数据库事务失效问题解决

让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,所以数据库事务失效了

你可能感兴趣的:(kafka,数据库,spring)