SpringBoot-多数据源@Transactional注解失效

一、项目背景
一直用@Transactional实现事务管理没有问题,直到今天在一个SpringBoot多数据源前台项目发现@Transactional注解失效了

二、项目代码

第一个数据源的事务管理器配置类 :

import com.alibaba.druid.pool.DruidDataSource;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import javax.sql.DataSource;

@Configuration
@MapperScan(basePackages = "com.frond.dao.datacenter" , sqlSessionTemplateRef = "datacenterSqlSessionTemplate")
public class DatacenterDataSourceConfiguration {

    @Bean(name = "datacenterDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.druid.datacenter")
    public DataSource dataSource(){
        return new DruidDataSource();
    }

    @Bean(name = "datacenterTransactionManager")
    public DataSourceTransactionManager transactionManager(@Qualifier("datacenterDataSource") DataSource dataSource){
        return new DataSourceTransactionManager(dataSource);
    }

}

第二个数据源的事务管理器配置类 :

import com.alibaba.druid.pool.DruidDataSource;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import javax.sql.DataSource;

@Configuration
@MapperScan(basePackages = "com.frond.dao.approval" , sqlSessionTemplateRef = "approvalSqlSessionTemplate")
public class ApprovalDataSourceConfiguration {

    @Bean(name = "approvalDataSource")
	@Primary
    @ConfigurationProperties(prefix = "spring.datasource.druid.approval")
    public DataSource dataSource(){
        return new DruidDataSource();
    }

    @Bean(name = "approvalTransactionManager")
	@Primary
    public DataSourceTransactionManager transactionManager(@Qualifier("approvalDataSource") DataSource dataSource){
        return new DataSourceTransactionManager(dataSource);
    }

}

注入事务管理器的bean时,默认是根据类型去注入,如果该类型有多个Bean,不通过bean的名字去注入,默认是会注入被@Primary标识的bean的,所以在这个项目中,当在业务层方法添加@Transactional注解时,默认是调用了approvalTransactionManager这个bean,但是如果方法中调用的是第一个数据源对应的Dao层方法时,直接添加@Transactional是不能实现事务管理的

三、解决办法
需要在使用@Transactional注解时指定使用的事务管理器的bean的名字

@Transactional(rollbackFor = Exception.class, transactionManager = "datacenterTransactionManager")

文章仅作为个人学习整理

你可能感兴趣的:(SpringBoot)