关于纯洁的微笑《Spring Boot(七):Mybatis 多数据源最简解决方案》文章补充说明多数据源事务的配置

关于Spring boot中使用Mybatis多数据源的配置,我推荐纯洁的微笑博主的《Spring Boot(七):Mybatis 多数据源最简解决方案》这篇文章,简单清晰易懂

疑问

但是有个疑问就是在DataSource1Config配置注入的数据库事务管理类DataSourceTransactionManager对象test1TransactionManager在后文中却没有使用到,照理说有改有个地方配置使用该对象,使不同的操作对应回滚不同的数据库

@Configuration
@MapperScan(basePackages = "com.neo.mapper.test1", sqlSessionTemplateRef  = "test1SqlSessionTemplate")
public class DataSource1Config {

    @Bean(name = "test1DataSource")
    @ConfigurationProperties(prefix = "spring.datasource.test1")
    @Primary
    public DataSource testDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "test1SqlSessionFactory")
    @Primary
    public SqlSessionFactory testSqlSessionFactory(@Qualifier("test1DataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mybatis/mapper/test1/*.xml"));
        return bean.getObject();
    }

    @Bean(name = "test1TransactionManager")
    @Primary
    public DataSourceTransactionManager testTransactionManager(@Qualifier("test1DataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    @Bean(name = "test1SqlSessionTemplate")
    @Primary
    public SqlSessionTemplate testSqlSessionTemplate(@Qualifier("test1SqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}

解决方法

其实很简单,在需要使用事务的类或方法上使用@Transactional注解,然后为其value属性指定DataSourceTransactionManager对象即可

修改原文中的UserController类后代码如下

@RestController
@Transactional(rollbackFor = Exception.class, value = "test1TransactionManager") // 在类上配置事务
public class UserController {

    @Autowired
    private User1Mapper user1Mapper;

    @Autowired
    private User2Mapper user2Mapper;

    @RequestMapping("/getUsers")
    @Transactional(value = "test1TransactionManager") // 在方法上配置事务
    public List getUsers() {
        List users = user1Mapper.getAll();
        return users;
    }

    @RequestMapping("/getUser")
    @Transactional(value = "test2TransactionManager") // 在方法上配置事务
    public UserEntity getUser(Long id) {
        UserEntity user = user2Mapper.getOne(id);
        return user;
    }

    @RequestMapping("/add")
    public void save(UserEntity user) {
        user2Mapper.insert(user);
    }

    @RequestMapping(value="update")
    public void update(UserEntity user) {
        user2Mapper.update(user);
    }

    @RequestMapping(value="/delete/{id}")
    public void delete(@PathVariable("id") Long id) {
        user1Mapper.delete(id);
    }

}

参考

关于Spring Boot中Mybatis的多数据源配置还可以参考我的另一篇文章

《Spring Boot Mybatis数据库datasource多数据源配置》

 

 

 

你可能感兴趣的:(Mybatis,Spring,Boot,spring,boot,Mybatis,datasource,多数据源,数据库)