Springboot2+mybatis+druid多数据源事务无效

框架springboot2,数据库中间件为mybatis,用druid管理多数据源

1、尝试解决问题

在处理事务的时候遇到问题,首先按照网上查询到的资料进行了如下配置:

1) 在启动类上增加@EnableTransactionManagement注解

2)配置文件里增加:spring.transaction.rollback-on-commit-failure=true 配置
3)在service实现类上面增加 @Transactional(rollbackFor = Exception.class) 注解,意思是只要发生异常事务就回滚
4)try catch里 增加TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
 

按照上面几个步骤配置后,事务依旧没有生效,查阅很多资料后,发现可能是多数据源配置影响事务处理

2、解决问题最终方案

在 @Transaction 注解里面可以指定事物管理器,但是需要手动配置mysql事务管理器的bean

如下图,使用druid管理多数据源会有相应的配置文件,以一个配置文件举例,这里是配置数据库相关配置的类,里面定义了事务bean,我们需要使用该事务管理器,只需要在 @Transactional(rollbackFor = Exception.class) 注解中,增加一个value=“事务管理器定义bean名” 指定该事务管理器作为事务管理用途即可。

package com.laibutec.app.config;
 
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
 
import javax.sql.DataSource;
 
@Configuration
public class DataSourcConfig {

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

 这里指定事务管理器

@Transactional(value = "transactionManager")

通过以上配置后,终于可以正常使用事务了,在此记录一下。

猜你喜欢

转载自blog.csdn.net/rao356/article/details/105530694
今日推荐